【问题标题】:Task.WhenAll - When to use this [duplicate]Task.WhenAll - 何时使用此 [重复]
【发布时间】:2014-09-08 16:49:14
【问题描述】:

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

Task.WhenAll 是做什么用的?

MSDN 中的Task.WhenAll

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    你应该在任何你想等待的地方使用WhenAll,而不必阻塞线程,这样可以提高可伸缩性。 (阅读:几乎可以在任何地方)

    【讨论】:

      【解决方案2】:

      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)有什么区别
      • @KevinBui 由于这是一个不同的问题,请考虑将其作为一个问题而不是作为评论提出。这将使您的问题更具可见性,可能会带来更好的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多