private Task RunTask(IActionContext actionContext, TaskDesc taskDesc, GroupInfo groupInfo)
        {
            bool isSubEntryAction = this.IsSubEntryGroup(taskDesc.TaskInfo.Action);

            if (!isSubEntryAction)
            {
                publishValueService.PublishVars(actionContext.Parameters, taskDesc.TaskInfo.Vars);
            }
            IExecuteContext executeContext = CreateExecuteContext(actionContext, taskDesc, isSubEntryAction);

            return(actionExecuterService.Execute(executeContext).ContinueWith((result) =>
            {
                if (result.IsCompleted && result.Exception == null)
                {
                    var executeResult = result.Result;
                    this.PublishResultVars(actionContext, executeResult, taskDesc);
                    PublishGlobalVars(actionContext, executeResult.IsSuccess, taskDesc);
                    List <TaskDesc> nextTasks = GetNextTasks(actionContext, executeResult.IsSuccess, taskDesc, groupInfo);
                    RunTasks(actionContext, nextTasks, groupInfo).Wait();
                }
                else
                {
                    throw WorkflowError.TaskEexcuteError(taskDesc.TaskName, result.Exception);
                }
            }, actionContext.Token, TaskContinuationOptions.None, TaskScheduler.Current));
        }
 private TaskDesc FindTaskInfo(string fromName, string taskName, GroupInfo groupInfo)
 {
     if (groupInfo.Tasks == null || !groupInfo.Tasks.ContainsKey(taskName))
     {
         throw WorkflowError.TaskNameNotFound(taskName);
     }
     return(new TaskDesc()
     {
         FromName = fromName,
         TaskName = taskName,
         TaskInfo = groupInfo.Tasks[taskName]
     });
 }