public static async Task EndSession <TStepId, TData>(SessionEndContext <TStepId, TData> context)
#endif
        {
            if (context.Session.Ended)
            {
                return;
            }

#if NET35 || NOASYNC
            SessionEndOperation.RemoveSessionFromStorage(context);
#else
            await SessionEndOperation.RemoveSessionFromStorage(context);
#endif

            TransactionResult <TStepId, TData> result = new TransactionResult <TStepId, TData>()
            {
                Session = context.Session,
                Result  = context.Result,
                Errors  = context.CaughtExceptions
            };
            context.Session.TransactionContext.Logger.InfoFormat(
                "Transaction '{0}' ended with result '{1}'",
                context.Session.TransactionContext.Info.Name,
                result.Result);
            context.Session.End(result);
        }
        public static async Task PrepareEndSession <TStepId, TData>(SessionEndContext <TStepId, TData> context)
#endif
        {
            if (context.Session.Ended)
            {
                return;
            }

            if (context.RunPostActions)
            {
                context.Session.StepEnumerator.Restart();
#if NET35 || NOASYNC
                RunPostOperation.RunPost(context);
#else
                await RunPostOperation.RunPost(context);
#endif
            }
            else
            {
#if NET35 || NOASYNC
                SessionEndOperation.EndSession(context);
#else
                await SessionEndOperation.EndSession(context);
#endif
            }
        }