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