Task.WhenAll - 何时使用此功能

时间:2014-07-17 17:29:04

标签: c# multithreading task-parallel-library task

我知道Task.WaitAll(Task1,Task2)等待所有提供的Task对象完成执行。

什么是Task.WhenAll用于?

MSDN中的

Task.WhenAll

  

创建一个任务,该任务将在所有提供的任务完成时完成   完成。

什么是真实世界的场景,曾经可以应用Task.WhenAll()

2 个答案:

答案 0 :(得分:8)

WaitAll阻止调用线程,而WhenAll提供了一个承诺任务,您可以使用异步等待async-await,同时不会浪费线程:

async Task ProcessAsync()
{
    await Task.WhenAll(DownloadAsync(), IntializeParserAsync(),...);
}

您应该在不需要阻塞线程的情况下使用WhenAll,这样可以提高可伸缩性。 (阅读:几乎你可以在任何地方)

答案 1 :(得分:4)

WaitAll是一个void函数,可以让您的代码在您调用它时立即等待完成多个任务。

另一方面,

WhenAll生成Task,等待其运行时的其他任务。例如,如果您要构建一个需要初始化一些事情的Task,然后运行一些计算,您可以这样做:

var initThenRun = Task
    .WhenAll(initTask1, initTask2, initTask3)
    .ContinueWith(computationTask);

现在initThenRun任务将运行三个初始化任务,等待所有这些任务完成,然后才进入computationTask