ToolStrip Memory Leak

I am having problems with memory leaks using SWF-ToolStrip. Accordingly, http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600# is allowed. But here it does not look like that.

Does anyone know how to solve this?

+3
source share
3 answers

This issue persists in .NET 3.5 SP1 as well as .NET 4.0.

, ToolStrip , , . . ToolStripOverflow, Microsoft.Win32.UserPreferenceChangedEventHandler. ToolStrip ToolStripOverflow, - .

, ToolStrips.

Dispose , ToolStrip, :

protected override void Dispose(bool disposing)
{

    if (disposing)
    {
        var overflow = toolStrip1.OverflowButton.DropDown as ToolStripOverflow;
        if (overflow != null)
            overflow.Dispose();
    }


    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

+3

. ToolStrip, SystemEvents.UserPreferenceChanged. , . , , ToolStrip.

​​ .NET 3.5 SP1. ToolStrip.Dispose() . , , Dispose() . Controls.Remove(), , Dispose() .

+1

Private Sub frmBase_FormClosed ( ByVal , ByVal e As System.Windows.Forms.FormClosedEventArgs) Me.FormClosed

    ' .NET BUG WORKAROUND
    ' MANUALLY DISPOSE OF ToolStip, MenuStrip and StatusStrip to release memory being held
    Dim aNames As New ArrayList
    Dim count As Integer = 0

    For Each oItem As ToolStripItem In Me.MenuStrip1.Items
        aNames.Add(oItem.Name)
    Next

    For i As Integer = 0 To aNames.Count - 1
        For Each oItem As ToolStripItem In Me.MenuStrip1.Items
            If oItem.Name = aNames(i) Then
                oItem.Dispose()
                Exit For
            End If
        Next
    Next

    count = 0
    aNames.Clear()
    For Each oItem As ToolStripItem In Me.ToolStrip1.Items
        aNames.Add(oItem.Name)
    Next

    For i As Integer = 0 To aNames.Count - 1
        For Each oItem As ToolStripItem In Me.ToolStrip1.Items
            If oItem.Name = aNames(i) Then
                oItem.Dispose()
                Exit For
            End If
        Next
    Next

    count = 0
    aNames.Clear()
    For Each oItem As ToolStripItem In Me.StatusStrip1.Items
        aNames.Add(oItem.Name)
    Next

    For i As Integer = 0 To aNames.Count - 1
        For Each oItem As ToolStripItem In Me.StatusStrip1.Items
            If oItem.Name = aNames(i) Then
                oItem.Dispose()
                Exit For
            End If
        Next
    Next

    Me.MenuStrip1.Dispose()
    Me.ToolStrip1.Dispose()
    Me.StatusStrip1.Dispose()

End Sub
+1
source

Source: https://habr.com/ru/post/1725031/


All Articles