datatable select时内部索引已经毁损解决方法

把datatable中的内容复制一份(深拷贝),然后操作新复制出来的datatable即可修复此问题。具体操作如下:

报错代码:

var pingResultToReport = pingResults.Select("Ping32AvgCost <> -2 and  IsReport=false");//.ToList();//

修改后代码

ResultSets.PingTestResultDataTable tmp = new ResultSets.PingTestResultDataTable();
lock (pingResults)
 {
     foreach (var row in pingResults)
     {
         tmp.Rows.Add(row.ItemArray);
         //row.IsReport = true;
     }
     tmp.AcceptChanges();
 }
 //0为值,-1为超时,-2为没测,-3为测试异常。默认值为 - 2
 var pingResultToReport = tmp.Select("Ping32AvgCost <> -2 and  IsReport=false");//.ToList();//浅拷贝

注意: datatable是非线程安全的,多线程操作时需要加锁
同时,由于datatable是引入类型,在foreach时候改变datatable中的字段值,这种更改会直接传递到数据表内部
尽可能在任何时候调用AcceptChanges();

你可能感兴趣的:(C#)