终结器卡在无限循环中

本文关键字:无限循环 | 更新日期: 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();
    }
}