终结器卡在无限循环中
本文关键字:无限循环 | 更新日期: 2023-09-27 18:19:58
我遇到了一个面试问题,我不知道答案(帮助不大:))好吧,它说明了某种东西:
Class SomeClass : IDisposable
{
public void Dispose()
{
while(true)
{
}
}
~SomeClass()
{
Dispose();
}
}
1) 在下一次GC之后不再引用对象时,对象是否最终确定?我的回答是否定的,因为终结线程将被卡在无限循环上。
2) 在Dispose中可以做些什么来结束最终确定,以及在处理对象之前循环将继续多少次(不考虑它将在下一代中花费的时间)
我不是特别清楚确切的问题。我有点没时间了。。。
在不知道答案的情况下,我放了一个静态计数器,它达到3,然后调用break并声明3从技术上讲是可行的:),但这不是的答案
我猜这与GC.SupressFinalize()有关?可能在进入循环之前调用GC.SupressFinalize()?
如果不是关于这个不清楚的问题的答案,更多的是关于他们的目标,还有什么想法吗?
发生什么并不重要。CLR将终止程序,终结器上有2秒的超时。
您可以使用布尔变量检查对象的已处理状态,这将有助于dispose方法进入无限循环
class SomeClass : IDisposable
{
bool _disposed = false;
public void Dispose()
{
while (true && !_disposed)
{
_disposed = true;
Console.WriteLine("disposed");
}
}
~SomeClass()
{
Dispose();
}
}