Task.WhenAll和任务启动行为

时间:2015-10-29 09:03:46

标签: c# task-parallel-library task

我使用Task.WhenAll有一个相当简单的应用程序。到目前为止我面临的问题是我不知道自己是否应该启动子任务,或者让WhenAll在适当时启动它们。

在线示例显示了使用框架方法中的任务,我不清楚返回的任务是否已经开始。但是我用Action创建了自己的任务,所以这是我必须解决的细节。

当我使用Task.WhenAll时,我应该直接启动组成任务,还是应该让Task.WhenAll处理它以获得乐趣,获利和提高执行速度?

为了进一步有趣,子任务包含大量阻塞I / O.

3 个答案:

答案 0 :(得分:12)

var unstartedTask = new Task(() => {}); await Task.WhenAll(unstartedTask); // this task won't complete until unstartedTask.Start() 无法为您启动任务。你必须自己启动它们。

Task.Run

但是,通常,已创建的任务(例如,使用asyncvar task = Task.Run(() => {}); await Task.WhenAll(task); // no need for task.Start() 方法等)已经启动。因此,您通常不必采取单独的操作来启动任务。

StrUtils

答案 1 :(得分:4)

  

我已经使用Action

创建了自己的任务

当您使用异步任务the convention is to only deal with tasks already in progress时。因此,使用Task构造函数和Start是不合适的;最好使用Task.Run

正如其他人所说,Task.WhenAll只聚合任务;它不会为你启动它们。

答案 2 :(得分:0)

Task.WhenAll(IEnumerable)将为您处理所提供的任务,但您可以使用最常用的方式创建它们 - 通过执行Task.Run(Action)或TaskFactory.StartNew(Action)方法。

仅供注意:如果任何任务在故障状态下完成,则生成的任务也将在故障状态下完成,并设置AggregateException Exception 属性。

相关问题