private async Task RunAsync(HandlerDelegate handlerDelegate, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { CloudQueueMessage message = null; try { message = await queue.GetMessageAsync(); var context = new AzureStorageQueueMessageContext { MessageId = message.Id, MessageHeaders = new Dictionary <string, string>() }; await handlerDelegate(message.AsString, context); await queue.DeleteMessageAsync(message); } catch (StorageException exception) { if (exception.IsNotFoundQueueNotFound() || exception.IsConflictQueueBeingDeletedOrDisabled() || exception.IsServerSideError()) { await queue.DeleteMessageAsync(message); } else { throw; } } catch (Exception e) { exceptionHandler.HandleException(ExceptionDispatchInfo.Capture(e)); } await Task.Delay(delayStrategy.Next(message != null), cancellationToken); } }