private void SubscribeMessages(QueueName requestQueueName, ref int processedMessages, CancellationToken token) { IQueueingService queueingService = CreateProvider(); processedMessages = 0; while (true) { // process request messages using (Claim claim = queueingService.ClaimMessage(requestQueueName, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1))) { List <QueuedMessage> messagesToDelete = new List <QueuedMessage>(); foreach (QueuedMessage queuedMessage in claim.Messages) { if (token.IsCancellationRequested) { return; } CalculatorOperation operation = queuedMessage.Body.ToObject <CalculatorOperation>(); CalculatorResult result; switch (operation._command) { case "+": result = new CalculatorResult(operation, operation._operand1 + operation._operand2); break; case "-": result = new CalculatorResult(operation, operation._operand1 - operation._operand2); break; case "*": result = new CalculatorResult(operation, operation._operand1 * operation._operand2); break; case "/": result = new CalculatorResult(operation, operation._operand1 / operation._operand2); break; default: throw new InvalidOperationException(); } messagesToDelete.Add(queuedMessage); queueingService.PostMessages(operation._replyQueueName, new Message <CalculatorResult>(TimeSpan.FromMinutes(5), result)); processedMessages++; } if (messagesToDelete.Count > 0) { queueingService.DeleteMessages(requestQueueName, messagesToDelete.Select(i => i.Id)); } } if (token.IsCancellationRequested) { return; } } }