Ответ 1
Финализаторы могут фактически никогда не выполняться, поскольку поясняет Раймонд Чен. Как ни странно, этот вопрос задают во время его ежегодной недели CLR, всего через два дня после того, как он объяснил это:)
Для ленивых (или, вернее, один) вывод:
Правильно написанная программа не может предположить, что финализаторы будут когда-либо выполняться.
Если вам интересно, можете ли вы полагаться на финализаторы, это уже все, что вам нужно знать: не полагайтесь на финализаторы.
Как сказал Раймонд Чен в связанной статье:
Финализаторы являются защитной сетью, а не основным средством для рекультивации ресурсов.
Если вы ищете, как выпустить ресурсы, посмотрите на шаблон одноразового использования.
Финализатор может не запускаться, например, если:
- Другой финализатор генерирует исключение.
- Еще один финализатор занимает более 2 секунд.
- Все финализаторы вместе занимают более 40 секунд.
- AppDomain сбой или разгрузка (хотя вы можете обойти это с помощью критического финализатора (CriticalFinalizerObject, SafeHandle или что-то в этом роде)
- Сбор мусора не происходит
- Сбой процесса
(Примечание: значения времени могут меняться со временем, но, конечно же, это было верно некоторое время назад.
Я думаю, есть намного больше вещей, которые могут заставить финализаторы никогда не запускаться. Нижняя строка, кроме цитаты от г-на Чена, что финализаторы являются сетью безопасности, которые уменьшают влияние ошибок, потому что, например, ресурсы выпущены когда-то, что лучше, чем никогда, если вы забудете сделать это эксцессом.