C#为什么这会导致内存泄漏
有一个简单的Windows窗体,上面有一些控件。我一直在寻找我认为是内存泄漏的东西。当我查看VS2015中的诊断工具时,每次实例化此表单时,我都会看到私有字节上升 因此,我编写了一个小例程,只需打开表单数百次,并在该表单中已经存在的计时器中添加了一个Close()。我把所有其他的事件处理程序都用这种形式删掉,并将其缩小到最简单的代码来演示这个问题 下面是我如何打开它C#为什么这会导致内存泄漏,c#,forms,memory-leaks,C#,Forms,Memory Leaks,有一个简单的Windows窗体,上面有一些控件。我一直在寻找我认为是内存泄漏的东西。当我查看VS2015中的诊断工具时,每次实例化此表单时,我都会看到私有字节上升 因此,我编写了一个小例程,只需打开表单数百次,并在该表单中已经存在的计时器中添加了一个Close()。我把所有其他的事件处理程序都用这种形式删掉,并将其缩小到最简单的代码来演示这个问题 下面是我如何打开它 for (int x = 0; x < 200; x++) { ne
for (int x = 0; x < 200; x++)
{
new frmShipIt().ShowDialog();
}
我不会发布Form.Designer代码,因为上面有很多控件
当我运行这个程序时,我看到VS诊断工具中的私有字节图几乎以45度的角度上升。如果我让它运行足够长的时间,它最终会抛出OutOfMemoryException
通过反复试验,我注释掉计时器事件处理程序中设置Enabled=false的行,问题就消失了。私有字节上升到一个点,然后变平。即使程序正在显示/关闭窗体对象。我可以毫无问题地运行它一整天。这是我所期望的,即使我在计时器事件处理程序中留下了有问题的行
所以我的问题是:“为什么?”
顺便说一句,如果我只是创建一个新表单,添加一个计时器并运行相同的测试,我看不到这个问题。所以这一定是我在表单上的其他控件造成的-但我不明白禁用计时器和其他控件之间怎么会有关系
所以我在寻找关于从哪里开始寻找的建议。在我关闭窗体之前设置Timer.Enabled=false如何导致GC无法从内存中删除此对象?我认为问题在于使用
ShowDialog
创建许多窗体-请参阅Try toDispose()
timerInitbeforethis.close()
aftertimerInit.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();
}