private static async Task RunDemoAsync(IMsmqProcessor processor, CancellationToken cancellationToken) { var stopTokenSource = new CancellationTokenSource(); cancellationToken.Register(stopTokenSource.Cancel); var options = new ExecutionDataflowBlockOptions { CancellationToken = cancellationToken, MaxDegreeOfParallelism = Environment.ProcessorCount * 2 }; var workersBlock = new ActionBlock <int>(x => RunWorkerAsync(x, stopTokenSource.Token), options); var processBlock = new ActionBlock <string>(data => processor.ProcessAsync(data, cancellationToken), options); // Execute Workers foreach (var worker in Enumerable.Range(1, Environment.ProcessorCount)) { workersBlock.Post(worker); } workersBlock.Complete(); // Process Items foreach (var item in Enumerable.Range(1, MaxItems)) { processBlock.Post(item.ToString(CultureInfo.InvariantCulture)); } processBlock.Complete(); processBlock.Completion.ContinueWith(t => stopTokenSource.Cancel()); await Task.WhenAll(processBlock.Completion, workersBlock.Completion); }
public MsmqService(ILogger <MsmqService> logger, IMsmqConnection connection, IMsmqProcessor processor) { Logger = logger ?? throw new ArgumentNullException(nameof(logger)); Connection = connection ?? throw new ArgumentNullException(nameof(connection)); Processor = processor ?? throw new ArgumentNullException(nameof(processor)); }