Exemple #1
0
        /// <summary>
        ///     按顺序执行工作
        ///     前一个附加的执行信息会附加到下一个工作者的工作参数中
        /// </summary>
        /// <param name="args">工作参数</param>
        /// <param name="token"></param>
        /// <param name="isOutputAttachedResult">是否输出附加结果(建议在子流程中设为true,用于将子流程中的结果返回至父流程中)</param>
        /// <returns></returns>
        public async Task <WorkResult> ExecuteWorkAsync(WorkArgs args, CancellationToken token,
                                                        bool isOutputAttachedResult = false)
        {
            var result = new WorkResult {
                IsSuccessful = true
            };
            var resultContents = new Dictionary <string, object>();

            //创建一个新的工作参数的副本用于工作流程中
            var innerArgs = new WorkArgs();

            foreach (var propertyName in args.PropertyNameList)
            {
                if (args.GetProperty(propertyName, out object obj))
                {
                    innerArgs.SetProperty(propertyName, obj);
                }
            }

            foreach (var worker in Workers)
            {
                result = await worker.ExecuteWorkAsync(innerArgs, token).ConfigureAwait(false);

                foreach (var propertyName in result.PropertyNameList)
                {
                    if (result.GetProperty(propertyName, out object obj))
                    {
                        innerArgs.SetProperty(propertyName, obj);
                        if (resultContents.ContainsKey(propertyName))
                        {
                            resultContents[propertyName] = obj;
                        }
                        else
                        {
                            resultContents.Add(propertyName, obj);
                        }
                    }
                }

                if (!result.IsSuccessful)
                {
                    break;
                }
            }

            if (!isOutputAttachedResult)
            {
                return(result);
            }

            //如果输出时需要附加结果,则将执行过程中产生的结果附加到返回值中
            foreach (var resultContent in resultContents)
            {
                result.SetProperty(resultContent.Key, resultContent.Value);
            }
            return(result);
        }
Exemple #2
0
 /// <summary>
 ///     构造函数
 /// </summary>
 /// <param name="args">触发异常的<see cref="WorkArgs" /></param>
 public WorkArgsException(WorkArgs args)
 {
     _workArgs = args;
 }