public StartAsync ( Task>.Func |
||
onMessage | Task>.Func | |
return | 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 pipelineFactory = new ChainFactory(); pipelineFactory.Register(() => new LogStep(countdown)); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayInUsing()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new DelayInUsing()); pipelineFactory.Register(() => new DelayBefore()); pipelineFactory.Register(() => new DelayAfter()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new PassThrough()); pipelineFactory.Register(() => new ThrowException()); var strategy = new PushMessages(messages, maxConcurrency: 1); await strategy.StartAsync(tm => Connector(pipelineFactory, tm)); await Task.Delay(2000); await strategy.StopAsync(); }