Финализатор застрял в бесконечном цикле - PullRequest
6 голосов
/ 12 января 2012

Я наткнулся на вопрос интервью, на который я не знал ответа (небольшая помощь :)) ну это что-то вроде:

Class SomeClass : IDisposable 
{
    public void Dispose()
    {
        while(true)
        {
        }
    } 

    ~SomeClass()
    {
        Dispose();
    }
}  

1) Завершается ли объект, когда на него больше не ссылаются после следующего ГХ? Мой ответ был НЕТ, потому что поток завершения будет зависать в бесконечном цикле.

2) Что можно сделать в Dispose, чтобы завершить финализацию и сколько раз цикл будет продолжаться до удаления объекта (без учета времени, которое он проведет в следующем поколении)

Мне не совсем понятен точный вопрос (2). Мне не хватило времени ...

Не зная ответа, я поставил статический счетчик, который доходит до 3 и вызывает перерыв и сообщает 3 что технически будет работать :), но это не ответ

Я предполагаю, что это как-то связано с GC.SupressFinalize ()? может быть, вызов GC.SupressFinalize () перед входом в цикл?

Есть ли какие-либо идеи, если не в ответе на неясный вопрос, больше о том, к чему они могли стремиться?

Ответы [ 2 ]

8 голосов
/ 12 января 2012

Это довольно несущественно, что происходит. CLR завершит работу программы, на финализаторе есть тайм-аут на 2 секунды.

0 голосов
/ 07 марта 2013

вы можете проверить состояние удаления объекта с помощью логической переменной, которая поможет методу dispose перейти в бесконечный цикл

class SomeClass : IDisposable
{

    bool _disposed = false;

    public void Dispose()
    {
        while (true && !_disposed)
        {
            _disposed = true;
            Console.WriteLine("disposed");
        }
    }

    ~SomeClass()
    {
        Dispose();
    }
}
...