请考虑以下示例代码:
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()返回一个数据表。但是,由于我将其转换为我要添加到另一个列表中的列表,似乎我的方法是将数据表及其所有行保留在内存中。
此外,清除列表并将其清零,似乎并没有释放列表及其中的对象占用的资源。
那么实际上发生了什么,以及如何释放这些资源?
答案 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