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

时间:2013-01-15 20:17:43

标签: .net task-parallel-library

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

Task.Run(()=>Console.WriteLine("Nice program"));

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

这意味着Task.Run对于即发即弃的场景来说实际上是不行的。

2 个答案:

答案 0 :(得分:8)

  

这意味着Task.Run对于即发即弃的场景来说实际上是不行的。

嗯,你不想想要忘记 - 你要等到它完成。所以请使用返回给你的Task

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

如果不了解更多有关您的情况的话,很难给出比这更具体的建议,说实话......但是这样的事情肯定会奏效。

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

答案 1 :(得分:2)

根据定义,程序终止后,无法运行任何代码。这与Task.Run()无关。

如果你真正问的是:

  

Task在后​​台线程上运行,所以如果主线程完成(例如在用户关闭主窗口之后),它们不能保证运行完成甚至启动,我该如何解决?< / p>

然后有两个选项:要么不让主线程完成(例如通过Jon Skeet建议调用Task.WaitAll()),要么在前台线程上运行重要的Task。为此,您可以使用ParallelExtensionsExtras中的QueuedTaskScheduler