是Parallel.forEach(DataTable.AsEnumerable()线程安全

使用时如下

Parallel.ForEach(DataTable.AsEnumerable(), dr => { string str = dr["field1"].ToString(); //.... other stuff dr["f1"] = oA; dr["f2"] = oB; dr["f3"] = oC; }); 

每个线程在其自己的数据行上工作的位置

我会假设不是,但有关于假设的说法……

DataRow类的文档明确指出了这一点

此类型对于multithreading读取操作是安全的。 您必须同步任何写操作。

无法获得更具体的信息。

无论如何,并行写入数据表可能无法很好地扩展。 当多个线程访问共享状态并且单个数据表显然是共享状态时,可伸缩性会受到影响。 更重要的是,除非您使用NUMA硬件,否则您的CPU内核将争夺对相同内存总线的访问权限。

更好的解决方案是在单独的结构(例如并发集合之一 )中返回并行处理(“其他内容”)中的任何结果,并在循环结束时应用来自单个线程的更改。

另一个选择是使用PLINQ来计算结果,并使用简单的foreach迭代它们以将更改应用回DataTable。

更好的解决方案是完全丢弃原始数据表并返回包含所需字段的新对象。 除非您的代码要求结果是DataTable,否则您只需将结果作为IEnumerable返回

DataTable对于写操作不是线程安全的。 当您同时更改行时,您将更改DataTable的状态,因此这将导致问题。

如果对这些列中的任何列进行索引,那肯定是不安全的。
如果没有,它可能是安全的,但我不这么认为。