Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为什么这会导致内存泄漏_C#_Forms_Memory Leaks - Fatal编程技术网

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

C#为什么这会导致内存泄漏,c#,forms,memory-leaks,C#,Forms,Memory Leaks,有一个简单的Windows窗体,上面有一些控件。我一直在寻找我认为是内存泄漏的东西。当我查看VS2015中的诊断工具时,每次实例化此表单时,我都会看到私有字节上升 因此,我编写了一个小例程,只需打开表单数百次,并在该表单中已经存在的计时器中添加了一个Close()。我把所有其他的事件处理程序都用这种形式删掉,并将其缩小到最简单的代码来演示这个问题 下面是我如何打开它 for (int x = 0; x < 200; x++) { ne

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

因此,我编写了一个小例程,只需打开表单数百次,并在该表单中已经存在的计时器中添加了一个Close()。我把所有其他的事件处理程序都用这种形式删掉,并将其缩小到最简单的代码来演示这个问题

下面是我如何打开它

        for (int x = 0; x < 200; x++)
        {
            new frmShipIt().ShowDialog();
        }
我不会发布Form.Designer代码,因为上面有很多控件

当我运行这个程序时,我看到VS诊断工具中的私有字节图几乎以45度的角度上升。如果我让它运行足够长的时间,它最终会抛出OutOfMemoryException

通过反复试验,我注释掉计时器事件处理程序中设置Enabled=false的行,问题就消失了。私有字节上升到一个点,然后变平。即使程序正在显示/关闭窗体对象。我可以毫无问题地运行它一整天。这是我所期望的,即使我在计时器事件处理程序中留下了有问题的行

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

顺便说一句,如果我只是创建一个新表单,添加一个计时器并运行相同的测试,我看不到这个问题。所以这一定是我在表单上的其他控件造成的-但我不明白禁用计时器和其他控件之间怎么会有关系


所以我在寻找关于从哪里开始寻找的建议。在我关闭窗体之前设置Timer.Enabled=false如何导致GC无法从内存中删除此对象?

我认为问题在于使用
ShowDialog
创建许多窗体-请参阅Try to
Dispose()
timerInitbefore
this.close()
after
timerInit.Enabled=false
Dispose()
this.Close()
之后形成表单本身。我认为问题在于使用
ShowDialog
创建许多表单-请参阅尝试
Dispose()
timerInit在
this.Close()之后
timerInit.Enabled=false
Dispose()
this.Close()之后形成自身
    public frmShipIt()
    {
            InitializeComponent();
    }

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