4

SWF-ToolStrip でメモリ リークが発生して困っています。これによるとhttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#は解決されています。しかし、ここではそうではないようです。

誰でもこれを解決する方法を知っていますか?

4

3 に答える 3

1

これは非常に永続的な苦情です。リークの原因は、SystemEvents.UserPreferenceChangedイベントのイベントハンドラーをインストールするToolStripでした。ユーザーがテーマや配色を変更したことに対応して、自分自身を再描画できるようにします。これは静的イベントであり、イベントハンドラーの登録を解除するのを忘れると、ToolStripインスタンスが永続的にリークされます。

このバグは、.NET3.5SP1で確実に修正されています。ToolStrip.Dispose()メソッドは、イベントハンドラーの登録を解除します。それが実行しているバージョンである場合は、Dispose()メソッドが実際に実行されていることを確認してください。よくある間違いは、Controls.Remove()を使用してフォームからコントロールを削除した後、削除されたコントロールでDispose()を呼び出すのを忘れたことです。

于 2009-12-08T13:17:13.907 に答える
1

Private Sub frmBase_FormClosed(ByVal sender As Object, 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
于 2010-04-12T20:21:11.267 に答える