在程序中有这样的代码片段
string content = "";
//Grid.Rows.Count = 5000
for(int i =0 ; i <Grid.rows.Count; i++)
{
   //这句代码引起内存消耗猛增
   content=Grid.Rows[i].Cells[0].value.tostring();
   {
    /*下面的代码都已注释.方便测试
     ....
    */
   }
}
在运行上面的代码过程中, TaskManager中的内存资源占用不断增加(当前进程的)
主要这句代码所引起 content=Grid.Rows[i].Cells[0].value.tostring();
接下来,做了另外两个测试
1 将content=Grid.Rows[i].Cells[0].value.tostring();这句代码修改为 content = i.tostring(); 运行测试,内存占用无明显变化
2 将content=Grid.Rows[i].Cells[0].value.tostring();这句代码修改为Grid.Rows[i].Cells[0].value.tostring(); 运行测试,内存资源占用不断增加
由此确定,内存资源占用是Grid.Rows[i].Cells[0].value.tostring();这句代码所引起.
但是不清楚这句代码为什么会引起这么大的内存资源消耗, 还请大家指点.

解决方案 »

  1.   

    Grid.Rows[i].Cells[0].value 值具体是什么i.tostring() 不怎么增长是因为常用的字符串都被缓存了可以重复使用
      

  2.   

    答楼上的
    1 Grid.Rows[i].Cells[0].value 值是字符串2 i.tostring() 不怎么增长是因为常用的字符串都被缓存了可以重复使用
    应该只是在第一次调用上面的代码片段的时候会出现内存增长
    那为什么继续调用(比如第2次,3,4... ...)上面的代码片段时, 任然会不断的增长呢?
      

  3.   

    Grid.Rows[i].Cells[0].value 的字符串是不是很大
      

  4.   

    首先, content 这个变量,是做什么的?其次,根据.NET对字符串的使用方法,Grid.Rows[i].Cells[0].value的值如果不同,吃内存也是挺正常的。所以,应该看看整体的设计,才能提出更好的方法吧。
      

  5.   

    找你的说法,可以肯定的是Grid.Rows[i].Cells[0].value中不是值类型的数据,而是引用类型的(或者是你自己定义的类对象),并且可以肯定的是这个Grid.Rows[i].Cells[0].value中的数据没有重载ToString()方法,导致程序去自己调用系统的ToString()函数,这样导致所有的消耗都在转化为ToString的方法上,你可以自己重写ToString()方法,这样系统就不会自己进行转换了。而是按照你的方法进行转换。
      

  6.   

    答楼上的:
    1 Grid是直接与DataTable进行绑定的,Cells[0]绑定的是一个nvarchar()的列
    2 Content这个变量只是我后面注释的代码中会用到的,不过请注意,根据我测试的情况
      将content=Grid.Rows[i].Cells[0].value.tostring();这句代码修改为Grid.Rows[i].Cells[0].value.tostring(); 依然有内存占用不断增加的问题,所以问题不杂Content上面,而在Grid.Rows[i].Cells[0].value.tostring(); 上面
    3 "根据.NET对字符串的使用方法,Grid.Rows[i].Cells[0].value的值如果不同,吃内存也是挺正常的" 是的,在第一次调用上面的代码片段时,会耗内存,但是为什么在后续的调用过程中,内存消耗依然在增加
    说明: 现在问题已经解决, 如下
    将content=Grid.Rows[i].Cells[0].value.tostring(); 
    修改成  content =DataTable.Rows[i][0].ToString();(DataGridview与DataTable绑定的) 以后
    内存资源消耗就要小的多
    所以我想问题是不是出在DataGridview的 处理机制上