0

開発者は、WinForms ToolStrip コントロールを使用すると、一部のものを手動で強制的に解放しないと、マネージ メモリ リークが発生する可能性があることを知っています。システムの静的イベントの内部イベント ハンドラーを意味しますMicrosoft.Win32.SystemEvents.UserPreferenceChanged。リソースを適切に解放するには、ToolStrip Dispose メソッドを明示的に呼び出す必要があります。たとえば、thisまたはthis SO の投稿で説明されています。

ただし、System.ComponentModel.Component の子孫から ToolStrip を使用する場合、これは役に立ちません。少なくとも、私の場合はそうです。コードの対応する部分は次のとおりです。

Private Class DropDownFilterBox
    Inherits System.ComponentModel.Component

    Private WithEvents fToolStripMain As New AutoFilterToolStrip
    Private WithEvents fToolStripOKCancel As New AutoFilterToolStrip
    Private WithEvents fContextMenuStripCustomFilterOperators As New ContextMenuStrip
    Private WithEvents fToolStripDropDownCustomFilterDatePicker As New ToolStripDropDown
    Private WithEvents fToolStripControlHostCustomFilterDatePicker As New AutoFilterToolStripControlHostDatePicker

    .......................

    Public Overloads Sub Dispose()
        fToolStripMain.Dispose()
        fToolStripOKCancel.Dispose()
        fContextMenuStripCustomFilterOperators.Dispose()
        fToolStripDropDownCustomFilterDatePicker.Dispose()
        fToolStripControlHostCustomFilterDatePicker.Dispose()
        MyBase.Dispose()
    End Sub

End Class

AutoFilterToolStrip は次のように定義されます。

Private Class AutoFilterToolStrip
    Inherits ToolStrip
    ......................
End Class

、しかし、これは私たちの文脈では問題になりません。

DropDownFilterBox.Dispose を手動で呼び出して、必要に応じて使用済みリソースをクリーンアップすることさえありますが、これは何の効果もないようです。

一部の開発者は、ToolStrip を非表示にする (Visible プロパティを False に設定する) ことを推奨しています。これは、この場合、UserPreferenceChanged イベント ハンドラーが ToolStrip によって自動的に削除される必要があるためです。はい、作業を行う内部の HookStaticEvents メソッドが呼び出されます。しかし、これも役に立ちません。

リフレクションを使用して、問題のイベント ハンドラーを手動で切り離そうとしました。

RemoveHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _
    DirectCast( _
    System.Delegate.CreateDelegate(GetType(Microsoft.Win32.UserPreferenceChangedEventHandler), fToolStripMain, "OnUserPreferenceChanged"),  _
        Microsoft.Win32.UserPreferenceChangedEventHandler _
    )

、しかし、これも何の効果もありません。

私たちのケースでこのメモリ リークの問題を解決する方法と、このケースで ToolStrip.Dispose の明示的な呼び出しが機能しない理由についてのアイデアはありますか?

.NET Framework 4+ (クライアント プロファイル) 用の VB.NET 2010 で開発しています。

4

1 に答える 1