Должен ли я беспокоиться о вызове dispose для объектов, которые разделяют время жизни процесса? - PullRequest
8 голосов
/ 13 марта 2012

Мне известно, что все объекты, которые реализуют IDisposable, должны быть утилизированы, как только они больше не нужны, чтобы освободить память, используемую их неуправляемыми ресурсами.

Мой вопрос относится к объектам, которые, как я знаю, на самом деле будут жить до тех пор, пока сам процесс хоста не будет завершен. Будет ли иметь какое-то значение, если я распоряжаться ими или нет? Есть ли вероятность того, что память не будет освобождена, когда процесс умирает? А как насчет объектов GDI? Будут ли дескрипторы GDI освобождены, когда процесс умрет, даже если они не были уничтожены?

Я полностью понимаю, что это хорошая практика - все равно избавляться от всех предметов. Прошу чисто из любопытства.

Ответы [ 2 ]

7 голосов
/ 13 марта 2012

Это зависит от рассматриваемого объекта (ресурса).

Когда процесс завершает всю неуправляемую память, файловые дескрипторы и другие ресурсы ОС будут освобождены, даже если связанные с ними финализаторы не удалось запустить.

Но я не совсем уверен насчет дБ, дескрипторов-мьютексов и т. Д.

Поэтому, прежде чем вы сможете считать безопасным не вызов Dispose, вам придетсязнать о типе ресурса и как он связан с процессом.Гораздо проще просто вызвать Dispose () из общего принципа.

Но это теоретический аргумент, большинство классов будет использовать SafeHandle : CriticalFinalizerObject.Поэтому я не думаю, что это когда-либо является реальной практической проблемой.

2 голосов
/ 13 марта 2012

Нет.В design доступен IDisposable, позволяющий программе выпустить неуправляемый ресурс раньше, чем это могло бы сделать финализатор.Который выполняется в довольно непредсказуемое время, обычно позже всякий раз, когда выполняется сборка мусора.Вы не можете предсказать, когда это произойдет.

Нет смысла утилизировать при выходе из программы, финализатор гарантированно запустится непосредственно перед выгрузкой AppDomain и процесс завершится.

То естьэто какое-то злоупотребление IDisposable, код, который на самом деле ожидает, что вы его называете.Но обычно это основано на с использованием оператора , поэтому вряд ли вы столкнетесь с этим.

...