ToolStrip是否存在不泄漏内存的解决方法

时间:2011-10-10 20:18:08

标签: winforms .net-3.5 memory-leaks

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

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

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

[编辑该应用程序在3.5.1上运行,因此它不是真正修复的,或者我做了不同的事情)

我可以做一些事情,以便GC可以回收子表格的内存吗?

一旦删除ToolStrip,表单子表单就可以再次进行垃圾回收。

MainForm

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

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

SubForm

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

使用Toolstrip的实例保留图

enter image description here

Large Version

2 个答案:

答案 0 :(得分:1)

您正在显示一个对话框,但从不处理它,因此至少将它放在using()子句中,或者在适当的时候进行处理。详细了解ShowDialog here

答案 1 :(得分:1)

放入SubForm的终结器并向控制台写一些内容,以查看表单是否被销毁。有点像...

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

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

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