private async Task HandleMessageAsync(QueueMessage message) { Replicatable replicatable = null; try { replicatable = MessageSerializer.Deserialize(message.MessageText); using (var executionTimer = new ExecutionTimer()) { await _messageHandler.HandleAsync(replicatable, _cancellationToken); await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt, _cancellationToken); await Task.WhenAll(_replicationStatusLoggers.Select(r => r.SuccessAsync(replicatable, executionTimer.CalculateElapsedAndStopMeasuring()))); } } catch (UnsupportedMessageFormatException e) { await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt, _cancellationToken); await Task.WhenAll(_replicationStatusLoggers.Select(r => r.UnprocessableAsync(message.MessageId, message.PopReceipt, message.MessageText, e))); } catch (Exception e) { if (message.DequeueCount > _maximumNumberOfRetries) { await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt, _cancellationToken); await Task.WhenAll(_replicationStatusLoggers.Select(r => r.FailureAsync(replicatable, e))); } } finally { _concurrencyLimiter.Release(); } }