在执行一个9万多的数据处理时报错,报错信息如下:

recycle process encounter a exception collection was modified enumeration operation might not execute

代码如下(示意代码)

for(int i=0;i<dt.xxtable.rows.count;i++)

{

    var query=listquery.where(查询条件);

    foreach(item in query)      

    {

      强类型DT.row row1=强类型DT.row.addnewrow();

      row1.beginedit();

      row1.a=item.a;

      row1.b=item.b;

      row1.endedit();

      强类型DT.xxtable.addxx_row(row1);

     } 

}

 

在网上找了N多办法,全列出来供各位参考:

1、采用for循环而不采用foreach循环,这类主要针对的是循环体是LIST<>等集合的处理办法

2、采用ReaderWriterLock,ReaderWriterLockSlim(.net4?)处理数据

3、采用lock(object) 替换 lock(this)

前人总结的这么多居然对我们的代码都无效,我K。

解决办法:

新建立一个原datatable的克隆,操作这个新的datatable,最后将原有的 DATASET.ADDROW(NEWROW)替换为DATASET.IMPORTROW(ROW);

DataTable newdt=dt.xxxtable.clone();

for(int i=0;i<dt.xxtable.rows.count;i++)

{

    var query=listquery.where(查询条件);

    foreach(item in query)      

    {

      //强类型DT.row row1=强类型DT.row.addnewrow();
        强类型DT.row row1=newdt.NewRow() as 强类型DT.row ;
      row1.beginedit();
      row1.a=item.a;
      row1.b=item.b;
      row1.endedit();
       newdt.rows.add(row1);
     } 
     foreach(datarow row in newdt)
    {
          强类型DT.XXXtable.importrow(row);
    }


}

 

 

posted on 2012-07-02 16:24  forrestsun  阅读(405)  评论(0编辑  收藏  举报