Финализаторы может быть на самом деле никогда выполняется, так как Raymond Chen explains. Вид смешно, что этот вопрос задают во время его ежегодной недели CLR, всего два дня после того, как он объяснил :)
Для ленивых, то (или, вернее, один) вывод:
Правильно -писаная программа не может предположить, что финализаторы будут когда-либо выполняться.
Если вам интересно, можете ли вы положиться на финализаторы, это уже все, что вам нужно знать: не полагайтесь на финализаторы.
Как Raymond Chen также говорится в связанной статье:
Финализаторы подстраховка, а не основным средством для освоения ресурсов.
Если вы ищете, как освободить ресурсы, взгляните на одноразовый шаблон.
Финализатор не может работать, например, если:
- Другой финализатор генерирует исключение.
- Еще один финализатор занимает более 2 секунд.
- Все финализаторы вместе занимают более 40 секунд.
- AppDomain разрушился или выгружен (хотя вы можете обойти это с критической финализации (CriticalFinalizerObject, SafeHandle или что-то в этом роде)
- Нет мусора не происходит
- Процесс врезается
(Примечание: Значения времени могут меняться со временем, but were certainly true some time ago.)
Я думаю, что есть много вещей, которые могут привести к тому, что финализаторы никогда не будут работать. Нижняя строка, кроме цитаты от г-на Чена, что финализаторы являются безопасность при уменьшают влияние ошибок, потому что, например, ресурсы освобождаются когда-то, что лучше никогда, если вы забудете это сделать.
Не могли бы вы процитировать больше важных частей? И да, возможно, аскер с нетерпением ждал именно этой связи. ;) – mafu
На самом деле, поскольку многие люди спрашивают, как они могут полагаться на поведение финализатора, я думаю, что я * процитировал одну наиболее важную часть;) С другой стороны, другие поля в статье могут быть интересными. – OregonGhost
@OregonGhost: Я понимаю это право: если 20 финализаторов каждый забирают 1,95 секунды каждый, это hunky dory, и все будет выполнено - займет 39 секунд. Если требуется 2.05 секунды, выполнение всех остальных пропущено. Это кажется довольно сломанным. Было бы довольно грубо прерывать финализатор, который занимает более 2 секунд, чтобы позволить другим запускать на оставшуюся часть 40-секундного тайм-аута. Но сплетение вещей через две секунды показалось бы неудачным. – supercat