运行期间,.NET任务实例能否超出范围?

如果我有一个方法中的代码块(使用.NET 4和任务并行库):

var task = new Task(() => DoSomethingLongRunning()); task.Start(); 

方法返回,这个任务是否会超出范围,被垃圾收集,还是会运行完成? 我还没有注意到GCing的任何问题,但是要确保我不会为GC的竞争状态而设置自己。

更新:

在我回答了这个问题之后(很久以前),我发现任务总是会完成,这是不正确的 – 有一个小的,比方说“angular落”的情况,任务可能无法完成。

原因是这样的:正如我以前所回答的,任务本质上是线程的; 但是它们是后台线程。 后台线程在所有前台线程完成时自动中止。 所以,如果你对任务没有做任何事情,程序就结束了,那么任务就有可能不会完成。

你应该总是等待任务。 更多的信息可以在Jon给我的出色答案中find。


原版的:

任务计划到ThreadPool,这意味着它们基本上是线程¹(实际上,它们封装线程)。

从线程文档 :

一旦启动线程,就不必保留对Thread对象的引用。 线程继续执行,直到线程过程完成。

所以,不,没有必要保留一个参考。

此外,该文档指出,创build任务的首选方法是使用它的工厂:

您也可以使用StartNew方法在一个操作中创build和启动任务。 如果创build和调度不必分开,这是创build和启动任务的首选方法(…)

希望能帮助到你。


¹根据文件 :

一个任务代表一个asynchronous操作,在某些方面它类似于创build一个新的线程或ThreadPool工作项目,但在更高的抽象层次上。

任务将运行完成。 即使没有任何其他的引用(不是根源,我相信是术语),线程池仍然会引用它,并至less阻止它被垃圾收集(至less我说,因为即使完成后不保证是垃圾收集)直到完成。