强类型 TableAdapter 的内存泄漏

Memory Leak with Strongly Typed TableAdapter

考虑以下示例代码:

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() returns 是一个数据表。但是由于我将其转换为一个列表,我正在将其添加到另一个列表中,所以我的方法似乎是将数据表及其所有行留在内存中。

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

那么这里到底发生了什么,我该如何释放这些资源?

感谢 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