Я использую GDIView, чтобы попытаться отследить источник нескольких затяжных дескрипторов GDI, а источником, по-видимому, являются шрифты, используемые в меню в форме. Единственный способ, которым я нашел, чтобы убедиться, что дескрипторы шрифта GCed, заключается в том, чтобы явно установить их как null:
tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;
Это не кажется мне совершенно правильным, но я не знаю, как еще решить эту проблему. Кто-нибудь еще сталкивается с этой проблемой раньше?
Несмотря на то, что лучше всего позвонить IDisposable.Dispose()
самостоятельно, вызвав его напрямую или используя ключевое слово using. Некоторые объекты GDI + являются исключением из этого правила.
GDI + содержит предопределенные кисти и ручки в уроках кистей и ручек. Вы не должны вызывать Dispose()
для объектов, возвращаемых членами этих классов (или других предварительно кэшированных объектов GDI, которые вы сами не создали новым).
И примечание от MSDN - Font.Dispose
:
Всегда вызывайте Dispose перед тем, как вы отпустите свою последнюю ссылку на Font. В противном случае ресурсы, которые он использует, не будут освобождены до тех пор, пока мусор collector вызывает метод Finalize объекта Font.
Установка в null приведет к тому, что они будут собраны в мусор, и будет вызываться финализатор. Это может занять некоторое время, если нет давления памяти, объекты могут жить некоторое время.
System.Drawing.Font реализует IDisposable, поэтому вы должны вызвать Font.Dispose, чтобы освободить все неуправляемые ресурсы (дескрипторы GDI) детерминистически.
Я считаю, что вы должны явно вызывать Dispose, так как шрифт может быть общим, и поэтому форма не может удалить шрифт в методе Dispose.
Лучшей практикой является то, что если класс реализует IDisposable, вы должны сделать каждую попытку вызвать Dispose в своих экземплярах.
Большинство классов GDI поддерживают IDisposable.