Task.WhenAll和任务启动行为

Pup*_*ppy 7 c# task task-parallel-library

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

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

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

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

Ere*_*mez 13

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

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

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

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

  • 嗨!哥们儿。你确实解释得很好。荣誉 (2认同)

Ste*_*ary 5

我用 Action 创建了自己的任务

当您处理异步任务时,约定是只处理已经在进行中的任务。所以使用Task构造函数和Start是不合适的;最好使用Task.Run.

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