我在做一些测试与TPL和异步/等待和发现,我觉得意外的事:我是调度工作中使用lambda表达式和Task.Run运行,比如:
Task.Run(()=>Console.WriteLine("Nice program"));
然后我意识到,如果计划立即返回永远不会执行的工作。 是,在任何.NET应用程序的预期行为(WPF,表格等)? 有没有讨论这件事的任何文档?
这意味着,实际上Task.Run是一个没有去发射后不管的情况。
我在做一些测试与TPL和异步/等待和发现,我觉得意外的事:我是调度工作中使用lambda表达式和Task.Run运行,比如:
Task.Run(()=>Console.WriteLine("Nice program"));
然后我意识到,如果计划立即返回永远不会执行的工作。 是,在任何.NET应用程序的预期行为(WPF,表格等)? 有没有讨论这件事的任何文档?
这意味着,实际上Task.Run是一个没有去发射后不管的情况。
这意味着,实际上Task.Run是一个没有去发射后不管的情况。
好吧,你不想忘记-你要等到它完成。 因此,使用Task
多数民众赞成退还给您。
要做到这一点,你需要保持跟踪你推出这种方式,所有未完成的任务,然后使用类似Task.WaitAll(tasks)
在非后台线程。 你可能并不需要记住自己的任务 - 你只需要在每个任务完成时递减计数器,然后你只需要等待才能到零。
很难给出比这更具体的建议,而不更多地了解你的情况,说实话......但这样的事情肯定会工作。
您可以轻松地在自己方便的方法封装这一点,当然。
根据定义,程序结束后,没有代码可以运行。 这有什么用做Task.Run()
如果你实际上问的是这样的:
Task
S于后台线程运行,因此,如果主线程完成(用户关闭主窗口在例如经过),他们不能保证运行至完成或甚至开始,我该怎么解决呢?
这时有两种选择:要么不要让主线程完成(例如,通过调用Task.WaitAll()
作为乔恩斯基特建议),或运行重要Task
在前台线程秒。 要做到这一点,你可以使用QueuedTaskScheduler
从ParallelExtensionsExtras。