Ejemplo n.º 1
0
        /// <summary>
        /// Инициирует выполнение стейт-машины обработки пайплайна вызова метода.
        /// Вызывается для методов, возвращающих <see cref="Task{TResult}"/>.
        /// </summary>
        /// <param name="initialState">Начальное состояние.</param>
        /// <typeparam name="TResult">Тип возвращаемого результата.</typeparam>
        /// <returns>Результат вызова метода.</returns>
        public async Task <TResult> ExecuteAsync <TResult>(AsyncInvocationState <TPipeline> initialState)
        {
            try
            {
                var nextState = await initialState.MakeTransitionAsync <TResult>(_pipeline)
                                .ConfigureAwait(continueOnCapturedContext: false);

                while (nextState != null)
                {
                    nextState = await nextState.MakeTransitionAsync <TResult>(_pipeline)
                                .ConfigureAwait(continueOnCapturedContext: false);
                }
            }
            catch (Exception e)
            {
                _pipeline.Throw(e);
            }

            if (_pipeline.IsReturn())
            {
                return(await Task.FromResult((TResult)_pipeline.CurrentReturnValue)
                       .ConfigureAwait(continueOnCapturedContext: false));
            }

            if (_pipeline.IsExceptional())
            {
                return(await Task.FromException <TResult>(_pipeline.CurrentException)
                       .ConfigureAwait(continueOnCapturedContext: false));
            }

            return((TResult)_pipeline.CurrentReturnValue);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Инициирует выполнение стейт-машины обработки пайплайна вызова метода.
        /// Вызывается для методов, возвращающих <see cref="Task"/>.
        /// </summary>
        /// <param name="initialState">Начальное состояние.</param>
        public async Task ExecuteAsync(AsyncInvocationState <TPipeline> initialState)
        {
            var nextState = await initialState.MakeTransitionAsync(_pipeline)
                            .ConfigureAwait(continueOnCapturedContext: false);

            try
            {
                while (nextState != null)
                {
                    nextState = await nextState.MakeTransitionAsync(_pipeline)
                                .ConfigureAwait(continueOnCapturedContext: false);
                }
            }
            catch (Exception e)
            {
                _pipeline.Throw(e);
            }

            if (_pipeline.IsExceptional())
            {
                await Task.FromException(_pipeline.CurrentException)
                .ConfigureAwait(continueOnCapturedContext: false);
            }
        }