是什么导致无法收集C#中的线程?
时间:2020-03-05 18:58:30 来源:igfitidea点击:
在.NET中,此代码之后,有什么机制阻止"线程"对象被垃圾回收?
new Thread(Foo).Start(); GC.Collect();
是的,可以安全地假设某些东西引用了该线程,我只是在徘徊到底是什么。由于某些原因,Reflector不会向我显示" System.Threading",所以我自己也无法对其进行挖掘(我知道MS发布了.NET框架的源代码,只是没有用)。
解决方案
回答
好吧,可以肯定地假设,如果某个线程正在某个地方运行,而某个地方已经对其进行了引用,那么这足以阻止垃圾回收吗?
回答
将新线程分配给本地字段?
class YourClass { Thread thread; void Start() { thread = new Thread(Foo); thread.Start(); GC.Collect(); } }
垃圾收集会收集不是引用的所有内容,因此在代码中,没有字段/变量引用该线程,因此将对其进行收集。
回答
只要线程正在运行,运行时就会保留对该线程的引用。只要有人仍然保留该引用,GC就不会收集它。
回答
这是垃圾收集器的硬连线功能。不收集正在运行的线程。
回答
需要注意的重要一点是,如果线程标记为IsBackground = True,则不会阻止整个过程退出
回答
这取决于线程是否正在运行。如果我们只是创建了Thread对象而没有启动它,则它是一个普通的托管对象,即有资格使用GC。一旦启动线程,或者为已经运行的线程(GetCurrentThread)获取Thread对象,就会有些不同。现在,"暴露对象"(托管线程)在CLR中保持强引用,因此我们始终会获得相同的实例。当线程终止时,将释放此强引用,并且在我们没有对Thread(现在已失效)的任何其他引用时,将立即收集托管对象。