private void ListenToInternal <TEvent, THandler>() where TEvent : Event where THandler : IHandler <TEvent> { var queueUrl = _eventBusInitializer.GetQueueUrl <TEvent>(); var handler = Activator.CreateInstance <THandler>(); Task.Factory.StartNew(async() => { while (true) { var eventsReceived = await _sqsOperations.Dequeue(queueUrl); foreach (var eventReceivedRaw in eventsReceived) { _logger.Info($"Received {typeof(TEvent)}", eventReceivedRaw.Body); var eventReceived = JsonConvert.DeserializeObject <SqsPulledObject>(eventReceivedRaw.Body); try { var isHandledSuccessfully = await handler.HandleAsync(JsonConvert.DeserializeObject <TEvent>(eventReceived.Message)); if (isHandledSuccessfully) { #pragma warning disable CS4014 Task.Run(() => _sqsOperations.Delete(queueUrl, eventReceivedRaw)); #pragma warning restore CS4014 } else { //TODO //Dead letter queue } } catch (Exception e) { _logger.Error($"An unexpected error happened when processing the message {typeof(TEvent)}. {e}"); } } } }, _eventBusInitializer.GetCancellationToken <TEvent>().Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); }