我使用Task.WhenAll有一个相当简单的应用程序。到目前为止我面临的问题是我不知道自己是否应该启动子任务,或者让WhenAll在适当时启动它们。
在线示例显示了使用框架方法中的任务,我不清楚返回的任务是否已经开始。但是我用Action创建了自己的任务,所以这是我必须解决的细节。
当我使用Task.WhenAll时,我应该直接启动组成任务,还是应该让Task.WhenAll处理它以获得乐趣,获利和提高执行速度?
为了进一步有趣,子任务包含大量阻塞I / O.
答案 0 :(得分:12)
var unstartedTask = new Task(() => {});
await Task.WhenAll(unstartedTask); // this task won't complete until unstartedTask.Start()
无法为您启动任务。你必须自己启动它们。
Task.Run
但是,通常,已创建的任务(例如,使用async
,var 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 属性。