[英]VB.NET control GDI handle leak?
我有一個控件泄漏GDI句柄的問題。 這是控件的簡化版本:
Public Class FancyLabel Inherits Label Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit MyBase.OnPaint(e) End Sub End Class
當我運行程序時,GDI對象計數為38。
然后,我打開一個只有一個FancyLabel的表單,GDI對象計數增加到42。
然后,我關閉該表單,無論創建和關閉多少個表單實例,GDI計數都會降至39,並保持在那里。
有任何想法嗎?
謝謝合資
好吧,由於Windows窗體,GDI計數可能會增加。 系統呈現某些控件時,Windows窗體間接使用GDI。 您可以使用.NET Memory Profiler找出泄漏所在,並確定如何解決泄漏。
編輯:垃圾收集器不會自動拾取GDI對象。 您應該重寫Dispose方法,並確保正確處置所有GDI對象。
因此,如果您連續進行100次描述的過程,那么我認為GDI計數不會超過39?
如果是這樣,這可能是您必須忍受的。 FancyLabel必需的GDI對象不是.NET直接公開的對象。 我認為您能做的最好的就是在每一個機會處都放置包含GDI對象的控件。 但是,就您而言,這聽起來好像泄漏並不嚴重,可能不值得您為此煩惱。
您確實需要注意的是,泄漏會繼續累積並消耗重復使用的GDI對象。 僅用於踢球, 此處列出了GDI對象類型。 此參考與Windows Forms控件沒有直接關系,但是您可以想象一下某些控件可能正在使用什么(並且我確定在其他地方都有說明)。
幸運的是,Microsoft終於使用WPF擺脫了GDI對象。 一個純WPF應用程序將僅對窗口使用2個GDI對象(UI的其余部分不包含GDI)。 因此,如果您只是處於項目的開始階段,那么現在也許是考慮使用WPF的好時機。 ;)
如果您將繼續使用GDI對象,則可以使用一些檢漏儀。 如果使用此類程序,則會看到完整的堆棧,其中顯示了每個對象的創建位置。
設置標簽字體時,GDI對象計數增加。 因此,您可以調用該標簽的dispose方法,並將字體設置為null或將其設置為空。 這是預期的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.