예제 #1
0
파일: Chain.cs 프로젝트: DaisyFx/DaisyFx
        internal async Task <ExecutionResult> ExecuteAsync(T input, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            _logger.RequestingLock();
            await LockStrategy.RequestLockAsync(cancellationToken);

            _logger.Executing();

            using var context = new ChainContext(Name, _serviceProvider, cancellationToken);

            try
            {
                context.EventBroker.Publish(new ChainExecutionStartedEvent(context));

                var startTickCount = Environment.TickCount64;
                var result         = await ExecuteRootConnector(input, context);

                var duration = TimeSpan.FromMilliseconds(Environment.TickCount64 - startTickCount);

                LogResult(result);

                if (result is { Status : ExecutionResultStatus.Faulted, Exception : {} })
                {
                    await context.EventBroker.PublishAsync(new ChainExceptionEvent(context, result.Exception));
                }

                context.EventBroker.Publish(new ChainExecutionResultEvent(context, duration, result));

                LockStrategy.ReleaseLock();

                return(result);
            }
예제 #2
0
파일: Chain.cs 프로젝트: theb0rg/DaisyFx
        internal async Task <ExecutionResult> ExecuteAsync(T input, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            _logger.RequestingLock();
            await LockStrategy.RequestLockAsync(cancellationToken);

            _logger.Executing();

            using var context = new ChainContext(Name, _serviceProvider, cancellationToken);
            try
            {
                context.EventBroker.Publish(new ChainExecutionStartedEvent(context));

                var startTickCount = Environment.TickCount64;
                await _root.ProcessAsync(input, context);

                var duration = TimeSpan.FromMilliseconds(Environment.TickCount64 - startTickCount);

                if (context.Result == ExecutionResult.Unknown)
                {
                    context.SetResult(ExecutionResult.Completed);
                }
                else if (context.Exception is { } exception)
                {
                    await context.EventBroker.PublishAsync(new ChainExceptionEvent(context, exception));
                }

                context.EventBroker.Publish(new ChainExecutionResultEvent(context, duration, context.Result,
                                                                          context.ResultReason, context.Exception));

                LockStrategy.ReleaseLock();
            }
            catch (Exception e)
            {
                try
                {
                    _logger.LogCritical(e, "Critical failure");
                }
                finally
                {
                    Environment.Exit(2013);
                }
            }

            return(context.Result);
        }
예제 #3
0
 protected abstract ValueTask <TOutput> Invoke(TInput input, ChainContext context);
예제 #4
0
 ValueTask <TOutput> ILink <TInput, TOutput> .Invoke(TInput input, ChainContext context) => Invoke(input, context);
예제 #5
0
 protected abstract ValueTask <TOutput> ExecuteAsync(TInput input, ChainContext context);
예제 #6
0
 ValueTask <TOutput> ILink <TInput, TOutput> .ExecuteAsync(TInput input, ChainContext context) => ExecuteAsync(input, context);