public async Task Send(SagaConsumeContext <TSaga, TMessage> context) { var instance = new SagaInstance <TSaga>(context.Saga); await instance.MarkInUse(context.CancellationToken).ConfigureAwait(false); var activity = LogContext.IfEnabled(OperationName.Saga.Add)?.StartActivity(new { context.Saga.CorrelationId }); try { var sagaConsumeContext = new InMemorySagaConsumeContext <TSaga, TMessage>(context, context.Saga, () => RemoveNewSaga(instance, context.CancellationToken)); if (_withinLock) { _repository.AddWithinLock(instance); } else { await _repository.Add(instance, context.CancellationToken).ConfigureAwait(false); } sagaConsumeContext.LogAdded(); try { await _next.Send(sagaConsumeContext).ConfigureAwait(false); if (sagaConsumeContext.IsCompleted) { await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); sagaConsumeContext.LogRemoved(); } } catch (Exception exception) { await RemoveNewSaga(instance, context.CancellationToken).ConfigureAwait(false); sagaConsumeContext.LogRemoved(exception); throw; } } finally { instance.Release(); activity?.Stop(); } }