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

时间:2011-10-25 17:40:50

标签: c# asp.net garbage-collection datatable

我的应用程序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行之前释放该内存(或之前)第二次迭代)。我该怎么办?

5 个答案:

答案 0 :(得分:2)

如果将对数据表的每个引用设置为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控件/其他业务对象引用了数据表中的行数据。例如,您正在显示行数据,或者您已将行传递到另一个对象,并且它具有对此行的引用。

如果您的内存不断增加,则会出现内存泄漏,即您拥有越来越多的引用它们的对象,并且框架无法收集此数据,因为它认为它正在被使用。您将需要查看您的代码并尝试找出它泄漏的原因,内存分析器可能会有所帮助。

答案 1 :(得分:1)

如果不依赖GC,则无法将其从内存中删除。它将取决于GC何时以及如何释放内存。 GC以不确定的方式工作,这意味着您无法确定GC何时实际释放实例

您应该确保在不再需要DataTable时不要保留任何参考。如果您已正确完成该部分,即除非有必要,否则没有对DataTable的引用,那么您就是好的并且在GC上保持休息

答案 2 :(得分:1)

我怀疑尝试重建GC无论如何都是一个好设计。 为什么不运行一个24/7运行的循环任务,只是将Process作为一个新线程启动?线程完成后你可以销毁它,结果你没有内存问题。

答案 3 :(得分:0)

垃圾收集将需要完全处理它,但如果您不再需要它,您可以始终将其设置为空。

//do some stuff with the table

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

答案 4 :(得分:0)

您可以始终将数据表本身包装在using块中,而不是调用dispose方法:

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

这可以确保在对象本身超出其范围时清理它。

MSDN Article本身是一个显而易见的资源,如果您以前从未使用过它,但这个想法非常简单。