是什么阻止了 C# 中的线程被收集?
-
09-06-2019 - |
题
在.NET中,在这段代码之后,什么机制会停止 Thread
对象不被垃圾回收?
new Thread(Foo).Start();
GC.Collect();
是的,可以肯定地假设 某物 有一个关于线程的参考,我只是在想到底是什么。由于某种原因 Reflector 没有向我显示 System.Threading
, ,所以我自己无法挖掘它(我知道微软发布了.NET框架的源代码,我只是手头没有它)。
解决方案
只要线程正在运行,运行时就会保留对线程的引用。只要有人仍然保留该引用,GC 就不会收集它。
其他提示
这取决于线程是否正在运行。如果您刚刚创建了 Thread 对象并且没有启动它,那么它是一个普通的托管对象,即符合GC资格。一旦启动线程,或者当您获取已运行线程的 Thread 对象(GetCurrentThread)时,情况就会有所不同。“公开对象”(托管线程)现在在 CLR 中保留强引用,因此您始终会获得相同的实例。当线程终止时,这个强引用被释放,并且一旦没有任何其他对(现已死亡)线程的引用,托管对象就会被收集。
这是垃圾收集器的硬连线功能。不收集正在运行的线程。
好吧,可以安全地假设,如果一个线程正在某个地方运行,那么某个东西引用了它,那么这不足以停止垃圾收集吗?
但需要注意的重要一点 - 如果您的线程标记为 IsBackground=True,它不会阻止整个进程退出
将新线程分配给本地字段?
class YourClass
{
Thread thread;
void Start()
{
thread = new Thread(Foo);
thread.Start();
GC.Collect();
}
}
垃圾收集收集所有非引用的内容,因此在您的代码中没有引用线程的字段/变量,因此它将被收集。
不隶属于 StackOverflow