首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToolStrip内存泄漏

ToolStrip内存泄漏
EN

Stack Overflow用户
提问于 2009-12-08 17:19:53
回答 3查看 2.9K关注 0票数 4

我一直在为SWF-ToolStrip的内存泄漏问题而烦恼。根据这个http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#已经被解决了。但在这里,它看起来不是。

有人知道怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2013-09-04 18:30:36

要重现该问题,您必须创建一个ToolStrip,其中包含的项目超过了它所能显示的数量,这会导致它创建一个溢出按钮。ToolStrip不会释放ToolStripOverflow对象,这会导致事件处理程序无法删除并导致泄漏。

这给我们在一个使用ToolStrips创建表单的大型应用程序中带来了巨大的问题。

解决方法是更改承载ToolStrip的窗体或控件的Dispose方法,如下所示:

代码语言:javascript
复制
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);
}

这为我们解决了问题

票数 5
EN

Stack Overflow用户

发布于 2009-12-08 21:17:14

这是一个非常持久的抱怨。泄漏的来源是为SystemEvents.UserPreferenceChanged事件安装事件处理程序的ToolStrip。以便它可以响应用户改变主题或配色方案并重新绘制自身。这是一个静态事件,忘记注销事件处理程序将永久泄漏ToolStrip实例。

这个错误已经在.NET 3.5 SP1中得到了修复。ToolStrip.Dispose()方法注销事件处理程序。如果这是您正在运行的版本,请确保Dispose()方法确实运行。一个常见的错误是使用Controls.Remove()从表单中移除控件,但随后忘记在移除的控件上调用Dispose()。

票数 1
EN

Stack Overflow用户

发布于 2010-04-13 04:21:11

私有子frmBase_FormClosed(ByVal发送者作为对象,ByVal e作为System.Windows.Forms.FormClosedEventArgs)处理Me.FormClosed

代码语言:javascript
复制
    ' .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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1865741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档