把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();