会发生什么去上班的Task.Run(计划)的程序终止后?(What happens to work

2019-07-18 06:13发布

我在做一些测试与TPL和异步/等待和发现,我觉得意外的事:我是调度工作中使用lambda表达式和Task.Run运行,比如:

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

然后我意识到,如果计划立即返回永远不会执行的工作。 是,在任何.NET应用程序的预期行为(WPF,表格等)? 有没有讨论这件事的任何文档?

这意味着,实际上Task.Run是一个没有去发射后不管的情况。

Answer 1:

这意味着,实际上Task.Run是一个没有去发射后不管的情况。

好吧,你不想忘记-你要等到它完成。 因此,使用Task多数民众赞成退还给您。

要做到这一点,你需要保持跟踪你推出这种方式,所有未完成的任务,然后使用类似Task.WaitAll(tasks)在非后台线程。 你可能并不需要记住自己的任务 - 你只需要在每个任务完成时递减计数器,然后你只需要等待才能到零。

很难给出比这更具体的建议,而不更多地了解你的情况,说实话......但这样的事情肯定会工作。

您可以轻松地在自己方便的方法封装这一点,当然。



Answer 2:

根据定义,程序结束后,没有代码可以运行。 这有什么用做Task.Run()

如果你实际上问的是这样的:

Task S于后台线程运行,因此,如果主线程完成(用户关闭主窗口在例如经过),他们不能保证运行至完成或甚至开始,我该怎么解决呢?

这时有两种选择:要么不要让主线程完成(例如,通过调用Task.WaitAll()作为乔恩斯基特建议),或运行重要Task在前台线程秒。 要做到这一点,你可以使用QueuedTaskScheduler从ParallelExtensionsExtras。



文章来源: What happens to work scheduled by Task.Run() after the the program terminates?