2015-02-11 50 views
0

考虑下面的示例代码:内存泄漏强类型的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()返回一个数据表。但是因为我将它转换为一个列表,我将其添加到另一个列表中,似乎我的方法是将数据表及其所有行留在内存中。

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

那么这里究竟发生了什么,以及如何释放这些资源?

+0

尝试创建/配置。我认为你需要不同的范围才能让GC完全清理那些东西。当前范围在您的示例中仍处于活动状态。我可能是可怕的错误,但... – TyCobb 2015-02-12 00:42:11

+0

哦,很好的电话。这很可能是真的。 – Josh 2015-02-12 18:48:08

回答

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 
+0

很高兴那个解决了。 – TyCobb 2015-02-12 21:26:10