如果我在方法中有以下代码块(使用 .NET 4 和任务并行库):
var task = new Task(() => DoSomethingLongRunning());
task.Start();
并且该方法返回,该任务是否会超出范围并被垃圾收集,或者是否会运行完成?我没有注意到 GC 的任何问题,但想确保我不会让自己陷入与 GC 的竞争条件。
Update:
在我回答这个问题后(很久以前!),我发现任务并不总是会运行完成——有一个小的,比如说“角落”情况,任务可能无法完成。
原因是这样的:正如我之前回答的,任务本质上是线程;但他们是背景线程。当所有前台线程完成时,后台线程将自动中止。因此,如果您不对任务执行任何操作并且程序结束,则任务有可能无法完成。
您应该始终等待任务。更多信息可以在乔恩给了我很好的答案 https://stackoverflow.com/a/14346197/227332.
原来的:
任务被调度到线程池中,这意味着它们本质上是线程1(实际上,它们封装了线程)。
来自线程文档 http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx:
没有必要保留
对 Thread 对象的引用一旦
已启动线程。线程
继续执行直到线程
程序已完成。
所以,不,没有必要保留对它的引用。
另外,文档 http://msdn.microsoft.com/en-us/library/dd537609.aspx指出创建任务的首选方法是使用它的工厂:
您还可以使用 StartNew 方法
一次创建并启动一项任务
手术。这是首选方式
创建并启动任务(如果创建)
和调度不必是
分开(...)
希望能帮助到你。
1 根据文档 http://msdn.microsoft.com/en-us/library/dd537609.aspx:
一个任务代表一个异步任务
操作,并且在某些方面
类似于创建一个新线程
或 ThreadPool 工作项,但在
更高层次的抽象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)