是什么阻止了C#中的线程被收集?

时间:2008-09-17 10:15:25

标签: .net multithreading garbage-collection

在.NET中,在此代码之后,什么机制阻止Thread对象被垃圾回收?

new Thread(Foo).Start();
GC.Collect();

是的,可以安全地假设某些东西有对线程的引用,我只是在徘徊究竟是什么。出于某种原因,Reflector没有向我展示System.Threading,所以我不能自己挖掘它(我知道MS发布了.NET框架的源代码,我只是没有它的方便)。

6 个答案:

答案 0 :(得分:14)

只要运行时,运行时就会保留对线程的引用。只要有人仍然保留该参考,GC就不会收集它。

答案 1 :(得分:7)

这取决于线程是否正在运行。如果您刚刚创建了Thread对象但没有启动它,则它是一个普通的托管对象,即符合GC条件。一旦启动线程,或者为已经运行的线程(GetCurrentThread)获取Thread对象,它就会有所不同。管理线程的“公开对象”现在在CLR中保持强引用,因此您始终获得相同的实例。当线程终止时,将释放此强引用,并且只要您没有任何其他对(现已死)线程的引用,就会收集托管对象。

答案 2 :(得分:2)

这是垃圾收集器的硬连线功能。不收集运行线程。

答案 3 :(得分:0)

嗯,可以安全地假设,如果一个线程正在某个地方运行某个东西有引用它,那么这不足以阻止垃圾收集吗?

答案 4 :(得分:0)

重要的一点是要注意 - 如果您的线程标记为IsBackground = True,则不会阻止整个进程退出

答案 5 :(得分:-3)

将新线程分配给本地字段?

class YourClass
{
  Thread thread;

  void Start()
  {
    thread = new Thread(Foo);
    thread.Start();
    GC.Collect();
  }
}

垃圾收集会收集不是引用的每一个,因此在您的代码中没有引用该线程的字段/变量,因此它将被收集。