/// <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);
            }
        }
        /// <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;
            }
        }