我一直在为SWF-ToolStrip的内存泄漏问题而烦恼。根据这个http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#已经被解决了。但在这里,它看起来不是。
有人知道怎么解决这个问题吗?
发布于 2013-09-04 18:30:36
要重现该问题,您必须创建一个ToolStrip,其中包含的项目超过了它所能显示的数量,这会导致它创建一个溢出按钮。ToolStrip不会释放ToolStripOverflow对象,这会导致事件处理程序无法删除并导致泄漏。
这给我们在一个使用ToolStrips创建表单的大型应用程序中带来了巨大的问题。
解决方法是更改承载ToolStrip的窗体或控件的Dispose方法,如下所示:
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);
}这为我们解决了问题
发布于 2009-12-08 21:17:14
这是一个非常持久的抱怨。泄漏的来源是为SystemEvents.UserPreferenceChanged事件安装事件处理程序的ToolStrip。以便它可以响应用户改变主题或配色方案并重新绘制自身。这是一个静态事件,忘记注销事件处理程序将永久泄漏ToolStrip实例。
这个错误已经在.NET 3.5 SP1中得到了修复。ToolStrip.Dispose()方法注销事件处理程序。如果这是您正在运行的版本,请确保Dispose()方法确实运行。一个常见的错误是使用Controls.Remove()从表单中移除控件,但随后忘记在移除的控件上调用Dispose()。
发布于 2010-04-13 04:21:11
私有子frmBase_FormClosed(ByVal发送者作为对象,ByVal e作为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 Subhttps://stackoverflow.com/questions/1865741
复制相似问题