具有强类型TableAdapter的内存泄漏

时间:2015-02-11 23:59:20

标签: vb.net visual-studio-2012 memory-leaks datatable .net-4.0

请考虑以下示例代码:

Dim ta as new LogsTableAdapter
Dim lstLogs as new List(of LogsRow)
lstLogs.AddRange(ta.GetData.ToList)
ta.Dispose
ta = nothing
lstLogs.clear
lstLogs = nothing
GC.Collect
GC.WaitForFullGCComplete()
GC.Collect

执行此代码后,使用windbg,我可以看到所有LogsRow对象以及表示这些对象字段的对象(字符串,整数小数等)仍然驻留在内存中。 LogsDataTable也驻留在内存中。

我知道ta.GetData()返回一个数据表。但是,由于我将其转换为我要添加到另一个列表中的列表,似乎我的方法是将数据表及其所有行保留在内存中。

此外,清除列表并将其清零,似乎并没有释放列表及其中的对象占用的资源。

那么实际上发生了什么,以及如何释放这些资源?

1 个答案:

答案 0 :(得分:1)

感谢TyCobb的评论,我将列表初始化代码移动到另一个方法,并重新构建为使用.Fill而不是.GetData(),并且在调用该方法之后,我手动执行垃圾收集,并且可以看到现在可以正确释放内存。

以下是我现在填写列表的方法,在一个单独的子目录中:

Using taFiles As New dsIBETTableAdapters.tblInfoDataTableAdapter With {.Connection = IbetConn}
    Using dtFiles As New dsIBET.tblInfoDataDataTable
        taFiles.Fill(dtFiles)
        lstFiles.AddRange(dtFiles.ToList)
    End Using
End Using