并发调用

通过首先调用等待的任务然后等待它们,可以同时等待多个调用。

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

firstTasksecondTaskthirdTask 完成时,RunConcurrentTasksWhenAny 返回的 Task 将完成。