应该在C#中始终保持对正在运行的Thread对象的引用?

或者可以这样做:
new Thread( new ThreadStart( delegate { DoSomething(); } ) ).Start();

我似乎记得,在这种情况下,Thread对象将被垃圾回收,但底层的操作系统线程将继续运行,直到委托结束传递给它.我基本上正在寻找ThreadPool功能,但不希望线程是背景线程(即我希望他们保持应用程序活着).

更新:根据Jason,CLR在运行时实际上保留了Thread对象的内部引用,所以在线程退出之前不会被垃圾回收.

解决方法

我一般发现,如果我需要直接在你的例子中开始一个新的线程,而不是从线程池中抓取一个线程,那么它是一个长时间运行的线程,我将需要一个引用来杀死它,监视它等等.对于短时间线程,如在后台线程等上调用IO,我总是使用线程池线程(通常间接通过someDelete.BeginBlah(…)方法调用).当使用像这样的线程池线程时,我宁可不保留引用.我不知道另一个程序员是否可能不适当地使用该线程的引用.如果我不需要参考,我不会保留它来混乱代码.

编辑:要回答关于正在垃圾回收的线程的编辑,线程运行时不会发生. CLR保持对每个正在运行的线程的引用.表示线程的对象将不被收集.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...