public async void Handle()
{
Interlocked.Increment(ref _waitingOnAsyncTasks);
try
{
try
{
await TryProcessIncomingMessage().ConfigureAwait(false);
_seriousExceptionProcessBackOffHelper.Value.Reset();
}
catch (MessageException exception)
{
UserException?.Invoke(this, new MessageErrorEventArgs(exception));
}
catch (CommitException exception)
{
UserException?.Invoke(this, new MessageErrorEventArgs(exception));
}
catch (Exception e)
{
SystemException?.Invoke(this, new MessageErrorEventArgs(e));
//generic exceptions tend to indicate a serious problem - lets start delaying processing
//this counter will reset once a message has been processed by this thread
_seriousExceptionProcessBackOffHelper.Value.Wait();
}
}
catch (Exception ex) //not cool - one of the exception events threw an exception
{
//there is not a lot we can do here - log the exception
_log.ErrorException("An error has occurred while trying to handle an exception", ex, null);
}
finally
{
Interlocked.Decrement(ref _waitingOnAsyncTasks);
}
}
/// <summary>