我有一个使用Task.WhenAll的相当简单的应用程序。到目前为止,我面临的问题是,我不知道是该自己启动子任务,还是让WhenAll酌情启动它们。
这些示例在线显示使用来自框架方法的任务,在这里,我不清楚返回的任务是否已经启动。然而,我已经用一个Action创建了我自己的任务,所以这是我必须解决的细节。
当我使用Task.WhenAll时,我是应该直接开始组成任务,还是应该让Task.WhenAll处理它以获得乐趣、利润和提高执行速度?
为了进一步的乐趣,子任务包含了大量的阻塞I/O。
发布于 2015-10-29 09:25:25
WhenAll不会为您启动任务。你得自己动手。
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()发布于 2015-10-29 11:58:34
我用一个动作创建了我自己的任务
当您处理异步任务时,约定只处理已经在进行中的任务。。因此,使用Task构造函数和Start是不适当的;最好使用Task.Run。
正如其他人所指出的,Task.WhenAll只聚合任务;它不为您启动它们。
发布于 2015-10-29 09:15:12
Task.WhenAll(IEnumerable)将为您处理所提供的任务,但是您可以使用最常见的方法创建它们--通过执行Task.Run(Action)或TaskFactory.StartNew(Action)方法。
请注意:如果在故障状态下完成了任何任务,则结果任务也将在故障状态下完成,并将AggregateException设置为其异常属性。
https://stackoverflow.com/questions/33409846
复制相似问题