将 Parallel.ForEach 与 DataTable 结合使用会引发对象引用异常



我的项目中有这段代码。 它做一些CPU处理,所以为了加快速度,我尝试使用Parallel.ForEach。

由于某种原因,并行执行会添加一个空项,导致在程序的后期阶段出现"对象引用未设置为对象的实例"异常。

**它不应该添加空

工作代码

foreach (DataRow datarow in dataSet.Tables[0].Rows)
{    
var item = new T();
for (int i = 0; i < datarow.Table.Columns.Count; i++)
{
var columnName = datarow.Table.Columns[i].ColumnName;
var columnValue = datarow[i];
// set new object values
// use reflection logic to grab values
}
finalList.add(item);
}

错误代码

List<DataRow> list = dataSet.Tables[0].AsEnumerable().ToList();
Parallel.ForEach<DataRow>(list, datarow =>
{    
var item = new T();
for (int i = 0; i < datarow.Table.Columns.Count; i++)
{
var columnName = datarow.Table.Columns[i].ColumnName;
var columnValue = datarow[i];
// set new object values
// use reflection logic to grab values
}
finalList.add(item);
}

为了回答这个问题,这段代码使用了一个非线程安全集合,List<>, , forFinalList,并行任务代码无法访问该集合。 它们应改用线程安全集合(如ConcurrentBag(作为集合类型。

可以在此处找到线程安全集合的列表。

最新更新