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