/// <summary>
        /// Executes all child tasks in parallel. If any child task fails, all child tasks
        /// that are still running will be terminated prematurely.
        /// </summary>
        /// <returns>Success if all child tasks run successfully, the result code of the
        /// first child task to fail if any fail, or interrupted if execution is terminated
        /// prematurely.</returns>
        public override TaskResultCode Execute()
        {
            int taskCount = ChildTasks.Count;

            _taskResults = new List <TaskResult>(taskCount);
            foreach (ITask task in ChildTasks)
            {
                AsyncTaskExecute execute = new AsyncTaskExecute(task.Execute);
                IAsyncResult     result  = execute.BeginInvoke(null, null);
                _taskResults.Add(new TaskResult()
                {
                    Task    = task,
                    Execute = execute,
                    Result  = result
                });
            }

            TaskResultCode resultCode = TaskResultCode.Success;
            bool           isDone     = false;

            while (!ShouldTerminate && !isDone)
            {
                int completedCount = 0;
                foreach (TaskResult taskResult in _taskResults)
                {
                    if (taskResult.Result.IsCompleted == true)
                    {
                        ++completedCount;
                        resultCode = taskResult.Execute.EndInvoke(taskResult.Result);
                    }

                    if (resultCode != TaskResultCode.Success)
                    {
                        Terminate();
                        break;
                    }
                }

                if (completedCount == taskCount)
                {
                    isDone = true;
                }
            }

            if (ShouldTerminate)
            {
                return(TaskResultCode.Interrupted);
            }
            else
            {
                return(resultCode);
            }
        }
Пример #2
0
        /// <summary>
        /// Executes each child task in order until all succeed or one fails.
        /// </summary>
        /// <returns>Success if all child task succeeds, or the result code of the
        /// first child task that is not successful.</returns>
        public override TaskResultCode Execute()
        {
            foreach (ITask task in ChildTasks)
            {
                TaskResultCode resultCode = task.Execute();
                if (resultCode != TaskResultCode.Success)
                {
                    return(resultCode);
                }
            }

            return(TaskResultCode.Success);
        }
Пример #3
0
        /// <summary>
        /// Executes the wrapped task <see cref="RunCount"/> number of times or until
        /// failure, whichever occurs first.
        /// </summary>
        /// <returns>Success if the wrapped task was run the set number of times without failure,
        /// or the result code of the last iteration if not successful.</returns>
        public override TaskResultCode Execute()
        {
            int            count  = 0;
            TaskResultCode result = TaskResultCode.Success;

            while ((count < RunCount) && (result == TaskResultCode.Success))
            {
                result = ChildTask.Execute();
                ++count;
            }

            return(result);
        }
Пример #4
0
        /// <summary>
        /// Executes the wrapped task, returning the inverse of the tasks result code.
        /// </summary>
        /// <returns>Success if the wrapped task returned a non-successful result code,
        /// or failure if it returned success.</returns>
        public override TaskResultCode Execute()
        {
            TaskResultCode result = ChildTask.Execute();

            return((result == TaskResultCode.Success) ? TaskResultCode.Failure : TaskResultCode.Success);
        }