在程序终止后,Task.Run()调度的工作会发生什么?

Bru*_*ant 4 .net task-parallel-library

我正在使用TPL和async/await进行一些测试,并注意到我发现意外的事情:我正在安排使用lambdas和Task.Run运行的工作,例如:

Task.Run(()=>Console.WriteLine("Nice program"));
Run Code Online (Sandbox Code Playgroud)

然后我意识到,如果程序立即返回,则工作永远不会执行.这是任何.NET应用程序(WPF,Forms等)中的预期行为吗?有没有讨论这个的文件?

这意味着Task.Run实际上是一个禁止发生火灾的场景.

Jon*_*eet 9

这意味着Task.Run实际上是一个禁止发生火灾的场景.

好吧,你不想忘记 - 你要等到它完成.所以使用Task那个返回给你的.

要做到这一点,您需要跟踪以这种方式启动的所有未完成的任务,然后使用类似Task.WaitAll(tasks)非后台线程的内容.您可能不需要记住任务本身 - 您只需要一个在每个任务完成时递减的计数器,然后您只需要等待它达到零.

在没有更多了解你的情况的情况下,很难提供更具体的建议,说实话......但是这样的事情肯定会奏效.

当然,您可以使用自己的便捷方法轻松封装它.

  • @BrunoBrant:不,任务不是线程。它们通常更接近于“线程池操作”。 (2认同)