public StartAsync ( Task>.Func |
||
onMessage | Task>.Func | |
Résultat | Task |
public Task StartAsync(Func<TransportMessage, Task> onMessage)
{
onMessageAsync = onMessage;
runningTasks = new ConcurrentDictionary<Task, Task>();
semaphore = new SemaphoreSlim(maxConcurrency);
tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
pumpTask = Task.Run(async () =>
{
while (!token.IsCancellationRequested)
{
await semaphore.WaitAsync(token).ConfigureAwait(false);
TransportMessage message;
if (messages.TryDequeue(out message))
{
var task = onMessageAsync(message);
runningTasks.TryAdd(task, task);
task.ContinueWith(t =>
{
semaphore.Release();
Task taskToBeRemoved;
runningTasks.TryRemove(t, out taskToBeRemoved);
}, TaskContinuationOptions.ExecuteSynchronously)
.Ignore();
}
else
{
await Task.Delay(TimeSpan.FromMilliseconds(20), token).ConfigureAwait(false);
}
}
}, token);
return Task.CompletedTask;
}
public async Task Do() { var messages = new ConcurrentQueue <TransportMessage>(); messages.Enqueue(new TransportMessage()); messages.Enqueue(new TransportMessage()); messages.Enqueue(new TransportMessage()); var countdown = new AsyncCountdownEvent(3); var chainFactory = new ChainFactory(); chainFactory.Register(() => new LogElement(countdown)); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayInUsing()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new DelayInUsing()); chainFactory.Register(() => new DelayBefore()); chainFactory.Register(() => new DelayAfter()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new PassThrough()); chainFactory.Register(() => new ThrowException()); var pushMessages = new PushMessages(messages, maxConcurrency: 1); await pushMessages.StartAsync(tm => Connector(chainFactory, tm)); await Task.Delay(2000); await pushMessages.StopAsync(); }