Почему ручки шрифтов не утилизируются?

2

Я использую GDIView, чтобы попытаться отследить источник нескольких затяжных дескрипторов GDI, а источником, по-видимому, являются шрифты, используемые в меню в форме. Единственный способ, которым я нашел, чтобы убедиться, что дескрипторы шрифта GCed, заключается в том, чтобы явно установить их как null:

tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;

Это не кажется мне совершенно правильным, но я не знаю, как еще решить эту проблему. Кто-нибудь еще сталкивается с этой проблемой раньше?

Теги:
winforms

3 ответа

6
Лучший ответ

Несмотря на то, что лучше всего позвонить IDisposable.Dispose() самостоятельно, вызвав его напрямую или используя ключевое слово using. Некоторые объекты GDI + являются исключением из этого правила.

GDI + содержит предопределенные кисти и ручки в уроках кистей и ручек. Вы не должны вызывать Dispose() для объектов, возвращаемых членами этих классов (или других предварительно кэшированных объектов GDI, которые вы сами не создали новым).

И примечание от MSDN - Font.Dispose:

Всегда вызывайте Dispose перед тем, как вы отпустите свою последнюю ссылку на Font. В противном случае ресурсы, которые он использует, не будут освобождены до тех пор, пока мусор collector вызывает метод Finalize объекта Font.

  • 0
    Есть ли способ узнать, какая последняя ссылка в форме? Или я должен рекурсивно избавляться от всех шрифтов в методе удаления моих форм?
1

Установка в null приведет к тому, что они будут собраны в мусор, и будет вызываться финализатор. Это может занять некоторое время, если нет давления памяти, объекты могут жить некоторое время.

System.Drawing.Font реализует IDisposable, поэтому вы должны вызвать Font.Dispose, чтобы освободить все неуправляемые ресурсы (дескрипторы GDI) детерминистически.

Я считаю, что вы должны явно вызывать Dispose, так как шрифт может быть общим, и поэтому форма не может удалить шрифт в методе Dispose.

  • 0
    Но dispose для шрифта должен вызываться методом dispose формы, верно? Я не вижу этого ни с одним из других элементов управления в форме, большинство из которых имеют связанные объекты шрифта.
  • 0
    Ах, я не знал, что вы избавлялись от формы. Я ожидал бы, что форма, которой располагают, должна освободить все неуправляемые ресурсы. Вы можете попытаться установить точку останова на Font.Dispose в отладчике и убедиться, что она вызывается, когда Dispose встречается в вашей форме.
Показать ещё 2 комментария
0

Лучшей практикой является то, что если класс реализует IDisposable, вы должны сделать каждую попытку вызвать Dispose в своих экземплярах.

Большинство классов GDI поддерживают IDisposable.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню