PLINQ更新失败

时间:2010-08-19 11:47:26

标签: .net linq plinq forall

抱歉我的英语。所以,这是我的问题 我正在尝试通过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);

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

请帮帮我

2 个答案:

答案 0 :(得分:3)

好吧,我现在可以告诉你modifying the rows of a DataTable in parallel is not Kosher(来自DataTable类的MSDN文档):

  

此类型对多线程安全   读操作。你必须同步   任何写操作。

因此,虽然我不确定究竟是什么导致您提及的特定异常,但我知道您确实不应该尝试此操作,因为它不受支持。

答案 1 :(得分:0)

找到解决方案:

table.AsEnumerable()。AsParallel()。ForAll(row =&gt; {lock(table)row [“val”] = 3;});

但在那之后 - 并行毫无意义