簡體   English   中英

如何在GC收集垃圾之前在asp.net中處理DataTable?

[英]How to dispose DataTable in asp.net before garbage collection by the GC?

我的應用程序24X7工作,我使用DataTable進行數據處理。

我每次都需要處理DataTable。 我使用了Dispose和Clear方法,但是當我調試代碼時,內容只被清除,其實例仍在內存中。

如何在不依賴GC的情況下將其從內存中刪除?

提前致謝..

編輯:這是我的代碼原型。 我是以兩種方式完成的。

 1     //Methord 1
 2               while (true)
 3               {
 4                   DataTable dt = new DataTable();
 5                   dt.Columns.Add("City", typeof(string));
 6                   dt.Rows.Add("ABC");
 7                   dt.Rows.Add("XYZ");
 8                   dt.Rows.Add("PQR");
 9                   dt.Rows.Add("LMN");
 10                   dt.Dispose();
 11               }
 12    //Methord 2
 13               while (true)
 14               {
 15                   using (DataTable dtable = new DataTable())
 16                   {
 17                       dtable.Columns.Add("City", typeof(string));
 18                       dtable.Rows.Add("ABC");
 19                       dtable.Rows.Add("XYZ");
 20                       dtable.Rows.Add("PQR");
 21                       dtable.Rows.Add("LMN");
 22                   }
 23               }

數據表如何處理? 如果你用斷點檢查,你可以看到數據表'dt'在調用dispose()后仍然有值。即使執行第11行仍然存在值。我需要在執行第12行之前釋放該內存(或之前)第二次迭代)。 我該怎么辦?

如果將對數據表的每個引用都設置為nothing / null,則可以對基礎數據進行垃圾回收。 當一個對象成為孤兒時,dotnet框架會在感覺合適時自動進行垃圾收集。

您可以告訴垃圾收集器手動收集,但它只會收集代碼中沒有引用的對象。 http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

關於dotnet GC如何工作的總結。 http://dotnetfacts.blogspot.com/2008/05/how-garbage-collector-works-part-1.html

如果垃圾收集器沒有釋放內存,可能是因為您可能編寫的其他對象,Ui控件/其他業務對象引用了數據表中的行數據。 例如,您正在顯示行數據,或者您已將行傳遞到另一個對象,並且它具有對此行的引用。

如果您的內存不斷增加,則會出現內存泄漏,即您有越來越多的對象引用它們,並且框架無法收集此數據,因為它認為它正在被使用。 您將需要查看您的代碼並嘗試找出它泄漏的原因,內存分析器可能會有所幫助。

如果不依賴GC,則無法將其從內存中刪除。 它將取決於GC何時以及如何釋放內存。 GC以不確定的方式工作,這意味着您無法確定GC何時實際釋放實例

您應該確保在不再需要DataTable時不要保留任何參考。 如果您已正確完成該部分,即除非有必要,否則沒有對DataTable的引用,那么您就是好的並且在GC上保持休息狀態

我懷疑嘗試重建GC無論如何都是一個很好的設計。 為什么不運行一個24/7運行的循環任務,只是將Process作為一個新線程啟動? 線程完成后你可以銷毀它,結果你沒有內存問題。

垃圾收集將需要完全處理它,但如果您不再需要它,您可以始終將其設置為null。

//do some stuff with the table

//don't need it any longer so set it null
table = null;

您可以始終將數據表本身包裝在using塊中,而不是調用dispose方法:

using (DataTable dt = new DataTable())
{
   //Do work here
}

這可以確保在對象本身超出其范圍時清除它。

MSDN文章本身是一個顯而易見的資源,如果您之前從未使用它,但這個想法非常簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM