簡體   English   中英

VB.NET控件GDI處理泄漏?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM