通过首先调用等待的任务然后等待它们,可以同时等待多个呼叫。
public async Task RunConcurrentTasks() { var firstTask = DoSomethingAsync(); var secondTask = DoSomethingElseAsync(); await firstTask; await secondTask; }
或者,Task.WhenAll可用于将多个任务分组为单个Task,当所有传递的任务完成时,该任务即完成。
public async Task RunConcurrentTasks() { var firstTask = DoSomethingAsync(); var secondTask = DoSomethingElseAsync(); await Task.WhenAll(firstTask, secondTask); }
您也可以在循环中执行此操作,例如:
List<Task> tasks = new List<Task>(); while (something) { // 做东西 Task someAsyncTask = someAsyncMethod(); tasks.Add(someAsyncTask); } await Task.WhenAll(tasks);
要在使用Task.WhenAll等待多个任务后从任务中获取结果,只需再次等待该任务即可。由于任务已经完成,因此只会将结果返回
var task1 = SomeOpAsync(); var task2 = SomeOtherOpAsync(); await Task.WhenAll(task1, task2); var result = await task2;
另外,Task.WhenAny可以像Task.WhenAll上面一样使用并行执行多个任务,不同之处在于,当提供的任何任务完成时,此方法也将完成。
public async Task RunConcurrentTasksWhenAny() { var firstTask = TaskOperation("#firstTask executed"); var secondTask = TaskOperation("#secondTask executed"); var thirdTask = TaskOperation("#thirdTask executed"); await Task.WhenAny(firstTask, secondTask, thirdTask); }
在Task通过返回RunConcurrentTasksWhenAny将完成任何时候的firstTask,secondTask或thirdTask完成。