我现在需要循环访问数据库,下面是具体的例子.请问,在这种情况下,是否需要显式的对dtTable进行垃圾回收?
while (true)
{
  DataTable webCCTable = dbo.GetDataTableBySQL(selectSql);
  if (webCCTable.Rows.Count > 0)
  {
    ...........
  }
}

解决方案 »

  1.   

    DataTable webCCTable
    while (true)
    {
      webCCTable = dbo.GetDataTableBySQL(selectSql);
      if (webCCTable.Rows.Count > 0)
      {
        ...........
      }
      

  2.   

    用using 关键字吧,在for循环里面。这样就能更显式的做垃圾回收了
      

  3.   

    To ZengHD:
    有一个技术细节我还没有搞清楚,就是DataTable定义的变量在内存中是如何存放的?当多次向DataTable变量中赋值以后,DataTable变量中原来的值是否完全被覆盖了?因为我不清楚这个,所以在这个例子中,我将变量定义放在了循环内.谢谢!
      

  4.   

    请这位朋友先看看Dispose的功能,不要误导新人
      

  5.   

    DataTable的局部变量是保存在栈上的,你每次给它赋值就是将new出来的托管堆上的地址赋值给这个局部变量。每次赋值会替换掉局部变量的值
      

  6.   

    谢谢fuadam的回复.接下来继续这个问题:既然DataTable的局部变量仅仅保存的是地址,那么地址指向的具体值应该是C#垃圾回收的对象了.对吗? 在我的例子中While内的循环会New 很多DataTable.是否有必要显式对它垃圾回收?如何回收? 谢谢~
      

  7.   

    你可以使用using来释放源源。每次循环完之后、系统将会自动回收一次。
      

  8.   

    gabage colector 把所有动态请求的内存放到堆上,当堆满了的时候就启动垃圾收集器,处理目前代码中的所有变量 ,检查对堆上的对象的引用,没有引用的变量就会被清除
      

  9.   

    显示gc的效率不好,你就交给gc自动回收就好了
      

  10.   

    为什么那么多大侠都叫楼主使用using呢
    正确地使用using是很不错的
    但像楼主的代码,在循环里创建、然后又释放资源,对速度、内存是不是会有影响呢?
    别说现在的硬件牛逼这点影响不用关心
    如果不用关心,我想楼主也不会发帖问了
      

  11.   

    DataTable webCCTable 
    while (true) 

      webCCTable = dbo.GetDataTableBySQL(selectSql); 
      if (webCCTable.Rows.Count > 0) 
      { 
        ........... 
      } 
      webCCTable = null;
    } 让GC自动回收
      

  12.   

    GC的目的就是自动回收,如果你的系统在内存回收的实时性上要求不大,就让GC自动回收吧,最多迟一点而已!
      

  13.   

    DataTable webCCTable 
    while (true) 

      webCCTable = dbo.GetDataTableBySQL(selectSql); 
      if (webCCTable.Rows.Count > 0) 
      { 
        ........... 
      } 
      webCCTable =null
      

  14.   

    的确是因为程序运行几个小时以后,会出现莫名其妙的问题.检查内存和CPU占用都不是很高.所以我认为和垃圾回收有关.
    谢谢各位的回帖!
      

  15.   

    首先这个问题确实不应该每次循环都做一次垃圾回收,
    但是using 关键字确实可以调用Dispose的。
      

  16.   


    如果内存属于正常,那跟垃圾回收没关系跟这里的DataTable没关系