C#为什么会导致内存泄漏

时间:2016-11-06 14:19:55

标签: c# forms memory-leaks

有一个简单的Windows窗体,上面有一些控件。我一直在寻找我认为是内存泄漏的东西。当我查看VS2015中的诊断工具时,我看到每次实例化此表单时都会看到私有字节爬升。

所以我编写了一个小例程,只打开表单几百次,并在已经存在于该表单中的计时器中添加了一个Close()。我以该形式拉出所有其他事件处理程序,并将其缩小到最简单的代码来演示问题。

以下是我如何打开它......

        for (int x = 0; x < 200; x++)
        {
            new frmShipIt().ShowDialog();
        }

这是表格类......

    public frmShipIt()
    {
            InitializeComponent();
    }

    private void timerInit_Tick(object sender, EventArgs e)
    {
        timerInit.Enabled = false; //...causes memory leak
        this.Close();
    }

我不会发布Form.Designer代码,因为它上面有很多控件。

当我运行它时 - 我看到VS诊断工具中的私有字节图以相当大的45度角上升。如果我让它运行得足够长,它最终会抛出一个OutOfMemoryException。

通过反复试验,我在计时器事件处理程序中注释掉了Enabled = false并且问题消失了。私有字节上升到一个点 - 然后升级。即使程序正在显示/关闭表单对象。我可以整天运行它没有问题。即使我在计时器事件处理程序中留下了违规行,我也会期待这一点。

所以我的问题是:“为什么?”

BTW - 如果我只是创建一个新表单,添加一个计时器并运行相同的测试我没有看到这个问题。所以它必须是我在表单上的其他控件之一引起的 - 但我不明白如何在禁用计时器和其他控件之间存在关系。

所以我正在寻找有关从哪里开始寻找的建议。在关闭表单之前如何设置Timer.Enabled = false会导致GC不从内存中删除此对象?

0 个答案:

没有答案