private async Task processAsync(EmailMessage emailMessage) { logger.LogDebug($"Start processing email message {emailMessage.Id}"); Interlocked.Increment(ref consumerTasksPending); try { await processor.ProcessAsync(emailMessage); logger.LogDebug($"Successfully processed email message {emailMessage.Id}"); } catch (SingleProcessingException e) { logger.LogError(e, $"Delivery error for message {emailMessage.Id}"); throw e; } catch (GeneralProcessingException e) { logger.LogError(e, $"General delivery problem for message {emailMessage.Id}"); await messageSource.RetryAsync(emailMessage); } catch (Exception e) { logger.LogError(e, $"Unexpected Exception while processing message {emailMessage.Id}"); throw e; } finally { Interlocked.Decrement(ref consumerTasksPending); } }