2

对不起我的英语不好。所以,这是我的问题,我正在尝试通过 PLINQ 更新 DataTable 这是我的代码

DataTable table = new DataTable();

table.Columns.Add(new DataColumn("val", typeof(decimal)));

int N = 1000000;

for (int i = 0; i < N; i++) table.Rows.Add(new object[] { i });

table.AsEnumerable().AsParallel().ForAll(row => row["val"] = 3);

但有例外:“索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”

请帮我

4

2 回答 2

3

好吧,我现在可以告诉你,并行修改 a 的行DataTable不是 Kosher(来自 MSDNDataTable类文档):

这种类型对于多线程读取操作是安全的。您必须同步任何写入操作。

因此,虽然我不确定是什么导致了您提到的特定异常,但我知道您真的不应该尝试这样做,因为它不受支持。

于 2010-08-19T13:24:07.020 回答
0

找到解决方案:

table.AsEnumerable().AsParallel().ForAll(row => { lock(table)row["val"] = 3; });

但在那之后 - 并行没有意义

于 2010-08-19T14:34:33.270 回答