Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在GC进行垃圾收集之前,如何在asp.net中处理DataTable?_C#_Asp.net_Garbage Collection_Datatable - Fatal编程技术网

C# 在GC进行垃圾收集之前,如何在asp.net中处理DataTable?

C# 在GC进行垃圾收集之前,如何在asp.net中处理DataTable?,c#,asp.net,garbage-collection,datatable,C#,Asp.net,Garbage Collection,Datatable,我的应用程序是全天候工作的,我使用DataTable进行数据处理 我每次都需要处理数据表。我使用了Dispose和Clear方法,但在调试代码时,内容只被清除,其实例仍在内存中 如何在不依赖GC的情况下将其从内存中删除 提前谢谢 编辑: 这是我的代码原型。我用两种方法做了这件事 1 //Methord 1 2 while (true) 3 { 4 DataTable dt = new Da

我的应用程序是全天候工作的,我使用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               }

数据表将如何处理?如果使用断点进行检查,即使在调用dispose()之后,您仍然可以看到数据表“dt”仍然有值。即使在执行第11行时,值仍然存在。我需要在执行第12行之前(或在while的第二次迭代之前)释放该内存。我应该在这里做什么?

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


当不再需要DataTable时,您应该确保不保留任何DataTable引用。如果您正确地完成了该部分,即除非需要,否则没有对DataTable的引用,那么您很好,将其余部分保留在GC上,您无法在不依赖GC的情况下将其从内存中删除。它将取决于GC何时以及如何释放内存。GC以一种不确定的方式工作,这意味着您无法确定GC何时实际释放实例


当不再需要DataTable时,您应该确保不保留任何DataTable引用。如果您正确地完成了这一部分,即除非需要,否则没有对DataTable的引用,那么您很好,将其余部分保留在GC上,垃圾收集将需要完全处理它,但是如果您不再需要它,您可以始终将其设为null

//do some stuff with the table

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

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

//do some stuff with the table

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

如果将对datatable的每个引用都设置为nothing/null,则可以对底层数据进行垃圾收集。当对象成为孤立对象时,dotnet框架会在认为合适时自动进行垃圾收集

您可以告诉垃圾收集器手动收集,但它将仅针对代码中没有引用的对象进行收集。

关于dotnetgc工作原理的总结。

如果垃圾收集器没有释放内存,可能是因为您可能编写的其他对象、Ui控件/其他业务对象引用了datatable中的行数据。例如,您正在显示行数据,或者您已将一行传递到另一个对象,并且该行具有对此行的引用


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

如果您将对datatable的每个引用都设置为nothing/null,则底层数据可能会被垃圾收集。当对象成为孤立对象时,dotnet框架会在认为合适时自动进行垃圾收集

您可以告诉垃圾收集器手动收集,但它将仅针对代码中没有引用的对象进行收集。

关于dotnetgc工作原理的总结。

如果垃圾收集器没有释放内存,可能是因为您可能编写的其他对象、Ui控件/其他业务对象引用了datatable中的行数据。例如,您正在显示行数据,或者您已将一行传递到另一个对象,并且该行具有对此行的引用


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

我怀疑尝试重新定义GC的功能是否是一个好的设计。
为什么不运行一个全天候运行的循环任务,作为一个新线程启动进程?当线程完成后,您可以销毁它,这样就不会出现内存问题。

我怀疑尝试重新编译GC所做的工作是否是一个好的设计。
为什么不运行一个全天候运行的循环任务,作为一个新线程启动进程?线程完成后,您可以销毁它,这样就不会出现内存问题。

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

using (DataTable dt = new DataTable())
{
   //Do work here
}
这将确保在对象本身超出其范围时将其清除


如果您以前从未使用过数据表,那么它本身就是一种明显的资源,但其思想非常简单。

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

using (DataTable dt = new DataTable())
{
   //Do work here
}
这将确保在对象本身超出其范围时将其清除


如果您以前从未使用过数据表,那么它本身就是一个明显的资源,但是它的想法非常简单。

因为我的应用程序是全天候运行的,而datatable占用了大量内存。实际上,这是一个循环。gc将仅在程序退出时收集,这在我的应用程序中不会发生。而且我不能等到gc收集到内存满的时候。你能显示循环代码吗?这可能有助于我们了解发生了什么。GC不会“仅在程序退出时”发生。我想你有一些基本的GC混乱你现在有记忆问题吗?比如,内存不足?因为我的应用程序全天候运行,而datatable占用了大量内存。实际上,这是一个循环。gc将仅在程序退出时收集,这在我的应用程序中不会发生。我也等不及了