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的一个字段中,因此在应用程序运行期间应保持在作用域中。。。。尽快销毁该对象…
,好吧,有时不会这么快。错。线程[在运行时]自根。未引用的[按用户代码]线程将不会被垃圾收集。