关于.net:是什么阻止了C#中的线程被收集?

关于.net:是什么阻止了C#中的线程被收集?

What prevents a Thread in C# from being Collected?

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

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

是的,可以安全地假设某些东西引用了该线程,我只是在徘徊什么。 由于某些原因,Reflector不会向我显示System.Threading,所以我自己也无法对此进行挖掘(我知道MS发布了.NET框架的源代码,只是没有用)。


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


这取决于线程是否正在运行。如果您只是创建了Thread对象而没有启动它,则它是一个普通的托管对象,即有资格使用GC。一旦启动线程,或者为已经运行的线程(GetCurrentThread)获取Thread对象,就会有些不同。现在,"暴露对象"(托管线程)在CLR中保持强引用,因此您始终会获得相同的实例。当线程终止时,将释放此强引用,并且在您没有对Thread的其他任何引用(现已死亡)时,将立即收集托管对象。


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


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


好吧,可以肯定地假设,如果某个线程正在某个有引用的地方运行,那足以阻止垃圾回收吗?


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

1
2
3
4
5
6
7
8
9
10
11
class YourClass
{
  Thread thread;

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

垃圾回收会收集不是引用的所有内容,因此在您的代码中,没有字段/变量引用该线程,因此将对其进行收集。


推荐阅读

    16天的最新的内存引用:4gb上涨10元

    16天的最新的内存引用:4gb上涨10元,,内存价格上涨到4GB 10元 在今天中关村的现货市场,内存价格总体呈发展趋势,但它是小的。内存市场昨日下

    wps如何生成引用

    wps如何生成引用,WPS教程,1.wps怎么添加引用文献wps添加引用文献:1、打开文档,点击WPS文字右侧下拉菜单。2、打开插入>引用>脚注与尾注3、选

    设置线程名称|tomcat线程名称设置

    设置线程名称|tomcat线程名称设置,,1. tomcat线程名称设置一.tomcat的优化1.tomcat的自身调优采用动静分离调优Tomcat线程池调优Tomcat的

    多线程cpu电脑|多线程的CPU

    多线程cpu电脑|多线程的CPU,,1. 多线程的CPU四核心四线程,表示这个电脑的CPU核心是4个核心、4个线程的。电脑CPU的核心数量和线程数量越多,

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法