2015-02-11 51 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