我正在使用TPL和async / await进行一些测试,并注意到我发现意外的事情:我正在安排使用lambdas和Task.Run运行的工作,例如:
Task.Run(()=>Console.WriteLine("Nice program"));
然后我意识到,如果程序立即返回,则工作永远不会执行。这是任何.NET应用程序(WPF,Forms等)中的预期行为吗?有没有讨论这个的文件?
这意味着Task.Run对于即发即弃的场景来说实际上是不行的。
答案 0 :(得分:8)
这意味着Task.Run对于即发即弃的场景来说实际上是不行的。
嗯,你不想想要忘记 - 你要等到它完成。所以请使用返回给你的Task
。
为此,您需要跟踪以这种方式启动的所有未完成任务,然后在非后台线程中使用Task.WaitAll(tasks)
之类的内容。您可能不需要记住任务本身 - 您只需要有一个在每个任务完成时递减的计数器,然后您只需要等待它达到零。
如果不了解更多有关您的情况的话,很难给出比这更具体的建议,说实话......但是这样的事情肯定会奏效。
当然,您可以使用自己的便利方法轻松封装它。
答案 1 :(得分:2)
根据定义,程序终止后,无法运行任何代码。这与Task.Run()
无关。
如果你真正问的是:
Task
在后台线程上运行,所以如果主线程完成(例如在用户关闭主窗口之后),它们不能保证运行完成甚至启动,我该如何解决?< / p>
然后有两个选项:要么不让主线程完成(例如通过Jon Skeet建议调用Task.WaitAll()
),要么在前台线程上运行重要的Task
。为此,您可以使用ParallelExtensionsExtras中的QueuedTaskScheduler
。