Explanation The Task.WaitAll method (Task[]) waits for all of the provided Task objects to complete execution. Example: // Construct started tasks Task<int>[] tasks = new Task<int>[n]; for (int i = 0; i < n; i++) { tasks[i] = Task<int>.Factory.StartNew(action, i); } // Exceptions thrown by tasks will be propagated to the main thread // while it waits for the tasks. The actual exceptions will be wrapped in AggregateException. try { // Wait for all the tasks to finish. Task.WaitAll(tasks); // We should never get to this point Console.WriteLine("WaitAll() has not thrown exceptions. THIS WAS NOT EXPECTED."); } Reference: Task.WaitAll Method (Task[]) https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx