6

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

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

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

这意味着 Task.Run 实际上是不适用的即发即弃的场景。

4

2 回答 2

12

这意味着 Task.Run 实际上是不适用的即发即弃的场景。

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

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

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

当然,您可以轻松地将其封装在您自己的便捷方法中。

于 2013-01-15T20:23:36.267 回答
3

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

如果您实际上要问的是:

Tasks 在后台线程上运行,所以如果主线程完成(例如,在用户关闭主窗口之后),它们不能保证运行完成甚至启动,我该如何解决这个问题?

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

于 2013-01-15T21:24:42.260 回答