如何在C#中运行多个异步任务并等待它们全部完成?

Task.WaitAll阻塞当前线程,直到所有其他任务已经完成执行。

Task.WhenAll方法用于创建一个任务,如果只有所有其他任务都和完整,将完成。在第一个示例中,我们可以看到在使用Task.WhenAll时,在其他任务完成之前执行了complete任务。这意味着Task.WhenAll不会阻止执行。在第二个示例中,我们可以看到,使用Task.WaitAll时,仅在所有其他任务完成后才执行完成任务。这意味着Task.WaitAll阻止执行。

示例

static void Main(string[] args){
   Task task1 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 1 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 1 complete");
   });
   Task task2 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 2 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 2 complete");
   });
   task1.Start();
   task2.Start();
   Console.WriteLine("等待任务完成。");
   Task.WhenAll(task1, task2);
   Console.WriteLine("两项任务均已完成。");
   Console.ReadLine();
}

输出结果

等待任务完成。
两项任务均已完成。
Task 1 - iteration 0
Task 2 - iteration 0
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 4
Task 2 complete

示例

static void Main(string[] args){
   Task task1 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 1 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 1 complete");
   });
   Task task2 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 2 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 2 complete");
   });
   task1.Start();
   task2.Start();
   Console.WriteLine("等待任务完成。");
   Task.WaitAll(task1, task2);
   Console.WriteLine("两项任务均已完成。");
   Console.ReadLine();
}

输出结果

等待任务完成。
Task 1 - iteration 0
Task 2 - iteration 0
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 2 - iteration 4
Task 2 complete
Both Tasks Completed