Task.WhenAll 和任务开始行为

Task.WhenAll and task starting behaviour

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

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

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

为了获得更多乐趣,子任务包含大量阻塞 I/O。

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

仅供注意:如果任何任务在 Faulted 状态下完成,生成的任务也将在 Faulted 状态下完成,将 AggregateException 设置为其 Exception 属性.

WhenAll 不会为您启动任务。你必须自己启动它们。

var unstartedTask = new Task(() => {});
await Task.WhenAll(unstartedTask); // this task won't complete until unstartedTask.Start()

但是,通常,创建的任务(例如使用Task.Runasync方法等)已经开始。因此,您通常不必采取单独的操作来启动任务。

var task = Task.Run(() => {});
await Task.WhenAll(task); // no need for task.Start()

I've created my own tasks with an Action

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

正如其他人指出的那样,Task.WhenAll 仅聚合任务;它不会为您启动它们。