【问题标题】:Is there a workaround for ToolStrip to not leak memoryToolStrip 是否有不泄漏内存的解决方法
【发布时间】:2011-10-10 20:18:08
【问题描述】:

我有一个简单的表单 (MainForm),它打开另一个表单 (SubForm),上面有一个 ToolStrip。

被调用的表单上没有其他内容。调用表单只有一个按钮。

由于 SystemEvents.UserPreferenceChanged 有一个事件处理程序,被调用的表单的内存永远不会被回收。我读到这是一个在 .NET 3.5.1 中得到修复的问题。

[编辑该应用程序在 3.5.1 上运行,因此要么它没有真正修复,要么我做了一些不同的事情]

我可以做点什么让 GC 可以回收子表单的内存吗?

只要我删除 ToolStrip,表单子表单就可以再次被垃圾收集。

主窗体

public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SubForm subForm = new SubForm();
            subForm.ShowDialog();
        }
    }

子表单

 public partial class SubForm : Form
    {
        public SubForm()
        {
            InitializeComponent();
        }
    }

带有工具条的实例保留图

Large Version

【问题讨论】:

  • 问题是什么?需要知道如何更新 .NET 以便修复错误?启用 Windows 更新。
  • 我猜不清楚该应用程序是否在版本 3.5.1 上运行。所以升级不会解决问题。
  • 这确实解决了它。我没有使用 dispose,因为在使用 ToolStrip 时它没有改变 .NET 2.0 中的任何内容,但现在它确实有效。您可以发表评论作为答案吗?

标签: winforms .net-3.5 memory-leaks


【解决方案1】:

您正在显示一个对话框,但从不处理它,所以至少将它放在 using() 子句中,或者在适当的时候以其他方式处理它。查看更多关于 ShowDialog here

【讨论】:

    【解决方案2】:

    SubForm 放入终结器,并在控制台中写入一些内容以查看表单是否被销毁。比如……

    ~SubForm()
    {
      Console.WriteLine("Destroyed!");
    }
    

    然后在创建表单的代码中,在ShowDialog 返回后,包含GC.Collect() 以进行垃圾回收。当您运行程序时,如果您看到控制台消息,那么一切都很好。如果不这样做,则可能是由 ToolStrip 内存泄漏引起的内存泄漏。

    如果是这种情况,请在 SubForm 的 FormClosed 事件中调用 ToolStrip 上的 Dispose(),然后重试。这适用于我使用有问题的.Net 2。如果再次运行,您应该会收到控制台消息。如果你不这样做,你可能有另一个内存泄漏(例如。DateTimePicker

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2010-10-15
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多