我的程序要求每隔一段时间去读取数据库数据进行处理,但发现程序一运行到DATASET的代码程序占用的内存就会增长,代码如下: private void MyTimer_Tick(object sender, EventArgs e)
 {
     ...
     Cmd.CommandText = "Select  * from T1";
     da = new SqlDataAdapter(Cmd);
     using (DataSet dataSet = new DataSet())
     {
        da.Fill(dataSet, "T1");
     }
     ...
 }当我把上述代码注释掉后,程序内存就正常了,不会再增长了。

解决方案 »

  1.   

    那是当然的……DataSet本来就是把数据放到内存里啊……
      

  2.   

    不停的Fill数据集,之前的数据没有清除,可以试着先清除在Fill
      

  3.   


    +1 每次都在不停地往内存里加东西,
    建议你在运行完一次之后就        
    da.Dispose();释放一下。
    要不你的机器过不了多久就会死机了。
      

  4.   

    da = new SqlDataAdapter(Cmd);
    这个da对象也是实现了IDisposable接口的,也是需要释放的
      

  5.   

    我在程序代码后有释放da,但还是一样
    da.Dispose()
      

  6.   

    将没用的DataSet中的表清除掉,比如执行前先Dataset.TableS.Clear();
      

  7.   


    试过了,也是一样。还试了:
    dataSet.Clear()以及dataSet.Reset(),都没有用
      

  8.   

    da.Dispose()之后再da=null一下
      

  9.   

    这个一般都是因为资源没有及时释放造成的,dataset是结果集,就是一直放内存。
    数据连接对象填充过后有没有关闭和释放,dataset有没有清除或重置。
      

  10.   


    数据连接对象有关闭,而且我是从外围一步步注释来测试的,最后发现是da.Fill(dataSet, "T1")这里导致内存增长的,但我试过用:
    dataSet.Dispose()/dataSet.Tables["T1"].Clear;dataSet.Dispose()/
    dataSet.Dispose();dataSet=null;/dataSet.Clear();dataSet.Dispose();
    dataSet.Reset();dataSet.Dispose();dataSet=null
    问题一样存在
      

  11.   

    Clear,Dispose+赋null都不好用,
    难道dataSet的引用赋值给别的成员或者全局变亮了??
      

  12.   


    为了方便测试我现在把一些无关的代码都注释掉了,只剩下连接数据库,Fill数据集,然后释放资源,关闭连接,没有赋值之类的代码
      

  13.   

    是这样的,.NET的CLR有自己的垃圾回收和内存释放机制,总共分成Gen0,Gen1,Gen2
    CLR会在自己认为合适的时候来进行清理和回收
    你这里无论做什么操作,都只是说这个对象你不会用了,但是你无法控制CLR到底在什么时候会进行垃圾清理和资源回收
    如果你非要控制内存的话。
    在使用之后,加上一句 System.GC.Collect();
    强制CLR对所有General的垃圾资源进行回收。
    不过是用CPU换内存空间而已,空间或时间的权衡了。
    如果你的系统将来可能的运行环境对内存有要求的话,还是有必要的。