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