【发布时间】:2014-09-08 16:49:14
【问题描述】:
我知道Task.WaitAll(Task1,Task2) 等待所有提供的 Task 对象完成执行。
Task.WhenAll 是做什么用的?
MSDN 中的Task.WhenAll 说
创建一个将在所有提供的任务都完成时完成的任务 完成。
曾经可以应用Task.WhenAll()的真实场景是什么
【问题讨论】:
标签: c# multithreading task-parallel-library task
我知道Task.WaitAll(Task1,Task2) 等待所有提供的 Task 对象完成执行。
Task.WhenAll 是做什么用的?
MSDN 中的Task.WhenAll 说
创建一个将在所有提供的任务都完成时完成的任务 完成。
曾经可以应用Task.WhenAll()的真实场景是什么
【问题讨论】:
标签: c# multithreading task-parallel-library task
WaitAll 阻塞了调用线程,而WhenAll 提供了一个承诺任务,您可以使用它异步使用async-await 等待,同时不会浪费线程:
async Task ProcessAsync()
{
await Task.WhenAll(DownloadAsync(), IntializeParserAsync(),...);
}
你应该在任何你想等待的地方使用WhenAll,而不必阻塞线程,这样可以提高可伸缩性。 (阅读:几乎可以在任何地方)
【讨论】:
WaitAll 是一个void 函数,可让您的代码在您调用它时立即等待多个任务完成。
另一方面,WhenAll 会生成一个Task,它会在需要运行时等待其他任务。例如,如果你正在构建一个需要初始化一些东西的Task,然后运行一些计算,你可以这样做:
var initThenRun = Task
.WhenAll(initTask1, initTask2, initTask3)
.ContinueWith(computationTask);
现在initThenRun 任务将运行三个初始化任务,等待它们全部完成,然后才继续执行computationTask。
【讨论】:
Task.Factory.ContinueWhenAll(new Task[]{initTask1, initTask2, initTask3}, computationTask)有什么区别