Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 只要对象被释放,.NET线程就会死亡_C#_.net_Multithreading - Fatal编程技术网

C# 只要对象被释放,.NET线程就会死亡

C# 只要对象被释放,.NET线程就会死亡,c#,.net,multithreading,C#,.net,Multithreading,我在自己的线程中运行此代码,该线程是使用new thread()创建的。只要obj处理完毕,螺纹就会消失。但是,线程执行不应该停止,因为循环是无止境的: while (true) { using (var obj = httpWebResponse.GetResponseStream()) { // do stuff } // never gets this far, thread dies } 为什么会发生这种情况?如果我显式调用obj.Dispose()

我在自己的线程中运行此代码,该线程是使用
new thread()
创建的。只要
obj
处理完毕,螺纹就会消失。但是,线程执行不应该停止,因为循环是无止境的:

while (true)
{
   using (var obj = httpWebResponse.GetResponseStream())
   {
      // do stuff
   }
   // never gets this far, thread dies
}
为什么会发生这种情况?如果我显式调用
obj.Dispose()
,也没什么不同。如果不进行处理,线程将正常运行并无限期地继续


CLR是否正在计算代码所持有的对象引用的数量,并在它们达到零时终止线程,尽管存在循环?

一旦没有对该对象的其他引用,垃圾收集器将拾取并销毁该对象。因此,如果您调用一个方法,并且在该方法中有一个引用线程的局部变量,那么一旦您离开该函数,该线程就会被终止(可能会在以后,这取决于垃圾收集器运行的时间)。确保线程保持运行的唯一方法是维护对线程的引用。这可以通过一个静态变量来实现,也可以通过一些不超出范围的其他变量来实现。

当接受的答案表示

“确保线程持续运行的唯一方法是维护 “对线程的引用”

正如西蒙指出的,根据微软的说法

“一旦创建线程,就不必保留对线程对象的引用 已启动线程。该线程将继续执行,直到 线程过程已完成。”


MyDisposable的
Dispose()
方法中有什么代码?是的,
MyDisposable.Dispose
看起来像什么?该
Dispose
方法是否可能引发异常?(当您使用
块在
周围放置
try..catch
块时会发生什么情况?)一次性对象实际上是一个流,由
HttpWebResponse.GetResponseStream()
返回。我更新了这个问题,因为这可能是相关的。如果我在try/catch中包装using块,则在线程死亡之前不会引发异常。@cxfx用try替换using块。最后,手动处理,看看您是否可以通过跟踪找到确切的死亡时刻……谢谢Kibbee。线程存储在WinForm的一个字段中,因此在应用程序运行期间应保持在作用域中。
。。。尽快销毁该对象…
,好吧,有时不会这么快。错。线程[在运行时]自根。未引用的[按用户代码]线程将不会被垃圾收集。