2009-04-16 42 views
2

我正在使用GDIView來嘗試追蹤一些滯留的GDI句柄的來源,並且該來源似乎是表單中菜單中使用的字體。我發現做的唯一的方式,以確保該字體句柄GCed是明確地將它們設置爲null這樣的:爲什麼字體句柄沒有被丟棄?

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

這似乎並不完全正確給我,但我不知道是怎麼回事解決這個問題。有沒有其他人遇到過這個問題?

回答

6

儘管最好通過直接調用或使用using關鍵字自己調用IDisposable.Dispose()。某些GDI +對象是此規則的例外。

GDI +在筆刷和筆類中包含預定義的筆刷和筆。你不應該在這些類的成員返回的對象(或者你還沒有自己創建的其他GDI預緩存對象)上調用Dispose()

而且從MSDN一張紙條 - Font.Dispose

總是調用Dispose你釋放你的最後一個引用字體之前。 否則,直到收集器調用Font對象的Finalize方法的垃圾 纔會釋放它正在使用的資源。

1

設置爲null會使它們最終被垃圾收集,並且調用終結器。這可能需要一些時間,如果沒有內存壓力的對象可能會生活一段時間。

System.Drawing.Font實現了IDisposable,因此您應該調用Font.Dispose來確定性地釋放所有非託管資源(GDI句柄)。

我相信你必須顯式調用Dispose,因爲字體可能是共享的,因此表單不能在Dispose方法中處理字體。

+0

但是配置爲字體應該用形式的dispose方法來調用吧?我沒有看到任何窗體上的其他控件,其中大部分都有關聯的字體對象。 – 2009-04-16 20:26:41

+0

啊,我不知道你是在處理這個表格。 我期望的形式;處置應釋放所有非託管資源。您可以嘗試在調試器中的Font.Dispose上放置一個斷點,並驗證它是在您的窗體上發生Dispose時調用的。 – Michael 2009-04-16 20:28:43

0

最佳實踐是,如果類實現了IDisposable,則應該儘可能在您的實例上調用Dispose。

大多數GDI類支持IDisposable。