C#并发通话

示例

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

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完成。