0

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

我在这里找到了这个:
我还想提一下,DataSet.Clear() 和 DataSet.Dispose() 不会使行被 GC 清除。.Clear() 方法将删除数据集中每个数据表中的所有数据行。但是,它不会删除表和关系。另外,.Dispose() 方法是由DataSet MarshalByValueComonent 的基类实现的,所以它不会释放dataset 的托管资源。

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

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

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

4

1 回答 1

0

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

在 VB.Net 你可以做

RemoveHandler frmChart.Load, AddressOf ControlLoad

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

于 2013-02-07T14:55:03.957 回答