Vb.net 将窗体用作控件时内存泄漏

Vb.net 将窗体用作控件时内存泄漏,vb.net,visual-studio,memory-leaks,Vb.net,Visual Studio,Memory Leaks,我构建了一个项目,其中在一个表单(frmDash)中,我将多个表单作为控件添加到一个容器中 frmChart.TopLevel = False frmChart.FormBorderStyle = False frmChart.ControlBox = False container.Controls.Add(frmChart) 当我关闭frmDash时,内存会减少,但没有预期的那么多。 因此,每次我重新打开frmDash时,内存都会比上次打开时增加。 当我关闭frmDash时: For ea

我构建了一个项目,其中在一个表单(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方法中,我处理所有我拥有的东西(数据表、列表、图表-我知道我不应该处理其中的一些,但我正在努力找出问题所在)。
有人知道我做错了什么吗

我找到了这个:
我还想指出,DataSet.Clear()和DataSet.Dispose()不会使GC清除行。Clear()方法将删除数据集中每个数据表中的所有数据行。但是,它不会删除表和关系。此外,.Dispose()方法由DataSet MarshallByValueCoMont的基类实现,因此它不会释放DataSet的托管资源

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

如果这是真的,我必须将每个datatable设置为nothing,因为我知道我只是在处理它


我这样做了,我将我使用的每个数据表设置为零,但内存泄漏仍然存在。

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

在VB.Net中你可以做什么

RemoveHandler frmChart.Load, AddressOf ControlLoad

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

您的代码错误,但这不是问题所在。您肯定犯了一个典型的错误,认为任务管理器是托管代码的合适内存分析器。事实并非如此。通过编写百万次创建和销毁表单的测试代码来获得信心。如果失败了,请使用真正的.NET分析器。谢谢您的评论。“我试试看。”汉帕桑说。我下载了redgate的内存配置文件,它向我展示了我做错了什么。你说得对,没有.Net分析器就像旅行没有地图一样。谢谢,因为我找到了一种通过内存档案器查找内存泄漏的方法,我接受你的回答是正确的,感谢你的努力和时间。谢谢