(.net) CriticalFinalizerObject - Что он действительно делает? - PullRequest
5 голосов
/ 21 июля 2009

Мое понимание этого класса состоит в том, что вы должны использовать его, когда хотите быть уверенным, что вызывается Finalizer (деструктор) или класс, но из пары тестов, которые я сделал, это не так Если он не гарантирует, что вызывается метод dispose, есть ли другой способ сделать это? Например, если я хочу убедиться, что какой-то код выполняется для завершения моего объекта, даже если я закрываю свою программу через диспетчер задач или что-то еще?

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

Если вам действительно нужен код для запуска, когда ваша программа имеет Ctrl + Alt + Del'd, я не думаю, что есть какой-либо другой способ, кроме как иметь отдельную программу, которая контролирует состояние первой. Если вам действительно нужна такая большая архитектура, я думаю, вы захотите использовать службу и некоторые клиентские приложения, или пару или службы.

Однако предполагается, что вы уже изучили события приложения. Если у вас нет, проверьте этот обзор .

EDIT Лучше, чем этот обзор, вероятно, событие ApplicationExit .

2 голосов
/ 21 июля 2009

из нескольких проведенных мной тестов, похоже, это не так.

Финализаторы в .Net являются недетерминированными. Это означает, что нет точной гарантии , когда вызовет финализатор. То, что объект вышел из области видимости или даже был удален, не означает, что финализатор будет вызван сразу. Сборщик мусора обойдет его в какое-то неизвестное время в будущем.

0 голосов
/ 20 января 2015

Метод Finalize() и метод Dispose() - это разные вещи.

По умолчанию Dispose никогда не будет вызван. Вам придется вызывать его самостоятельно из метода Finalize. Рассмотрим следующее (игнорируя очевидные сбои в правильном шаблоне завершения / удаления здесь, для краткости):

public class Foo : IDisposable
{
    public void Dispose() 
    {
        // NOP
    }

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