Esempio n. 1
0
        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));
 }