使用表单作为控件时内存泄漏

时间:2013-02-07 14:43:15

标签: vb.net visual-studio memory-leaks

我构建了一个项目,在一个表单中(frmDash)我在容器中添加了几个表单作为控件。

frmChart.TopLevel = False
frmChart.FormBorderStyle = False
frmChart.ControlBox = False
container.Controls.Add(frmChart)

当我关闭frmDash时,内存减少但没有预期的那么多 因此,每次重新打开frmDash时,内存都会相对于之前的打开时间增加 当我关闭frmDash时:

For each frm as frmChart in container.Controls
   frm.Close
Next

container.Controls.Clear
container.Dispose

在frmChart dispose方法中我处理了我拥有的所有东西(数据表,列表,图表 - 我知道我不应该处理其中的一些,但我试图找出问题所在。)
有谁知道我做错了什么?

我发现了here
我还想提一下,DataSet.Clear()和DataSet.Dispose()不会使GC清除行。 .Clear()方法将删除数据集内每个数据表中的所有数据行。但是,它不会删除表和关系。此外,.Dispose()方法由DataSet MarshalByValueComonent的基类实现,因此它不会释放数据集的托管资源。

要让GC清除所有数据表和数据行,请将ds设置为null,这样就不会引用原始数据集的所有托管资源,GC最终可以清除它们。另一种方法是使用DataSet.Reset,因此数据集将处于初始化状态,而不添加任何表或关系。

如果这是真的,我必须将每个数据表设置为空,因为正确知道我只是处理它。

我做到了,我设置的每个数据表都等于什么,但内存泄漏仍然存在。

1 个答案:

答案 0 :(得分:0)

如果为控件创建任何事件处理程序,则还需要释放这些事件处理程序。 .Net的GC将扫描它的对象以查找对象的链接。调用dispose会阻止您引用该对象,但如果仍然附加了事件处理程序,则GC会认为该事件仍然可以被引发。

在VB.Net中你可以做到

RemoveHandler frmChart.Load, AddressOf ControlLoad

这将允许GC从内存中删除对象。

希望这有帮助

戴夫