CriticalFinalizerObject использует недоразумение? - PullRequest
2 голосов
/ 01 апреля 2012

Я видел эту тему здесь, но не получил никакого ответа на мои мысли.

для моего понимания:

восстановление собственных ресурсов будет Всегда происходит!

  • при GC (после второго раунда)
  • вызов утилизации
  • с использованием Using
  • сбой программы
  • изящная программа завершения

так почему мне нужно наследовать от CriticalFinalizerObject?

Я не вижу ситуации, когда ресурсы не будут возвращены....

что мне не хватает?

Ответы [ 3 ]

4 голосов
/ 01 апреля 2012

Я хочу сказать, что родной ресурс всегда будет возвращен

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

Лучший пример - SQL Server.

2 голосов
/ 01 апреля 2012

Класс CriticalFinalizerObject добавляет некоторую надежность процессу удаления / завершения. Как предотвращение Thread.Abort() и др.

так зачем мне наследовать от CriticalFinalizerObject?

Основная причина использования Safehandle : CriticalFinalizerObject заключается в том, что он освобождает вас от работы с шаблоном неуправляемых ресурсов. SafeHandle превращает неуправляемый ресурс в управляемый ресурс, см. Джо Даффи .

Я не думаю, что как программисту приложения вам когда-либо придется извлекать класс из CriticalFinalizerObject, но когда вам приходится иметь дело с «дескриптором», вы должны использовать SafeHandle.

2 голосов
/ 01 апреля 2012

Все дело в контроле.Иногда вы хотите больше, чем просто восстановление собственных ресурсов.Большинство - если не все собственные потребители ресурсов в BCL реализуют CriticalFinalizerObject.Например, FileStream реализует CriticalFinalizerObject для очистки любых кэшированных данных до закрытия основного дескриптора файла.

...