2009-04-16 4 views
2

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

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

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

ответ

6

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

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

И записка от MSDN - Font.Dispose:

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

+0

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

1

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

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

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

+0

Но распоряжаться шрифтом следует вызывать методом dispose формы, правильно? Я не вижу этого с любыми другими элементами управления в форме, большинство из которых имеют связанные объекты шрифта. –

+0

А, я не знал, что вы распоряжаетесь формой. Я бы ожидал, что форма должна освободить все неуправляемые ресурсы. Вы можете попробовать поставить точку останова на Font.Dispose в отладчике и убедиться, что она вызывается, когда Dispose в вашей форме встречается. – Michael

+0

Сделал небольшое исследование и обновил ответ. – Michael

0

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

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

Смежные вопросы