public static async Task ProcessPost <TStepId, TData>(SessionEndContext <TStepId, TData> context) #endif { ITransactionStep <TStepId, TData> currentStep = context.Session.StepEnumerator.CurrentStep; ITransactionSession <TStepId, TData> session = context.Session; Stopwatch watch = new Stopwatch(); try { watch.Start(); #if NET35 || NOASYNC currentStep.PostAction(session.StepEnumerator.Data, context.Session); #else if (currentStep.PostAction != null) { currentStep.PostAction(session.StepEnumerator.Data, context.Session); } else { await currentStep.AsyncPostAction(session.StepEnumerator.Data, context.Session); } #endif watch.Stop(); if (session.ShouldLogStepExecution()) { session.TransactionContext .Logger .LogExecutionTime( watch.Elapsed, "Transaction '{0}': execution time for post step action for step '{1}' with id '{2}'.", session.TransactionContext.Info.Name, session.StepEnumerator.CurrentStepIndex, currentStep.Id); } } catch (Exception e) { watch.Stop(); string info = string.Format( "Transaction '{0}': an error occurred during processing post step action for step '{1}' with id '{2}', execution time '{3}'.", session.TransactionContext.Info.Name, session.StepEnumerator.CurrentStepIndex, currentStep.Id, watch.Elapsed); session.TransactionContext.Logger.ErrorFormat(e, info); #if NET35 || NOASYNC SessionEndOperation.EndSession(context.AddError(e)); #else await SessionEndOperation.EndSession(context.AddError(e)); #endif } }
public static void ProcessPost <TStepId, TData>(SessionEndContext <TStepId, TData> context)
public static async Task RunPost <TStepId, TData>(SessionEndContext <TStepId, TData> context) #endif { while (true) { ITransactionStep <TStepId, TData> step = context.Session.StepEnumerator.CurrentStep; if (step == null) { #if NET35 || NOASYNC SessionEndOperation.EndSession(context); #else await SessionEndOperation.EndSession(context); #endif return; } ITransactionSession <TStepId, TData> session = context.Session; if (session.Recovered && step.Settings.NotRunOnRecovered()) { session.TransactionContext .Logger .DebugFormat( "Transaction '{0}': ignoring the post step action for step '{1}' with id '{2}' as the step cannot be executed on a recovered transaction.", session.TransactionContext.Info.Name, session.StepEnumerator.CurrentStepIndex, session.StepEnumerator.CurrentStep.Id); session.StepEnumerator.MoveNext(); continue; } #if NET35 || NOASYNC if (step.PostAction == null) #else if (step.PostAction == null && step.AsyncPostAction == null) #endif { session.TransactionContext .Logger .DebugFormat( "Transaction '{0}': no post step action for step '{1}' with id '{2}'.", session.TransactionContext.Info.Name, session.StepEnumerator.CurrentStepIndex, session.StepEnumerator.CurrentStep.Id); session.StepEnumerator.MoveNext(); continue; } IExecutor executor = step.PostActionExecutor != null ? step.PostActionExecutor : step.Settings.SameExecutorForAllActions() ? step.StepActionExecutor : null; if (executor != null && executor.ShouldRun) { #if NET35 || NOASYNC executor.Run(() => { ProcessPostOperation.ProcessPost(context); if (!session.Ended) { session.StepEnumerator.MoveNext(); RunPostOperation.RunPost(context); } }); #else executor.Run(async() => { await ProcessPostOperation.ProcessPost(context); if (!session.Ended) { session.StepEnumerator.MoveNext(); await RunPostOperation.RunPost(context); } }); #endif return; } else { #if NET35 || NOASYNC ProcessPostOperation.ProcessPost(context); #else await ProcessPostOperation.ProcessPost(context); #endif session.StepEnumerator.MoveNext(); } } }