SWF-ToolStrip でメモリ リークが発生して困っています。これによるとhttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#は解決されています。しかし、ここではそうではないようです。
誰でもこれを解決する方法を知っていますか?
SWF-ToolStrip でメモリ リークが発生して困っています。これによるとhttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#は解決されています。しかし、ここではそうではないようです。
誰でもこれを解決する方法を知っていますか?
これは非常に永続的な苦情です。リークの原因は、SystemEvents.UserPreferenceChangedイベントのイベントハンドラーをインストールするToolStripでした。ユーザーがテーマや配色を変更したことに対応して、自分自身を再描画できるようにします。これは静的イベントであり、イベントハンドラーの登録を解除するのを忘れると、ToolStripインスタンスが永続的にリークされます。
このバグは、.NET3.5SP1で確実に修正されています。ToolStrip.Dispose()メソッドは、イベントハンドラーの登録を解除します。それが実行しているバージョンである場合は、Dispose()メソッドが実際に実行されていることを確認してください。よくある間違いは、Controls.Remove()を使用してフォームからコントロールを削除した後、削除されたコントロールでDispose()を呼び出すのを忘れたことです。
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