PLINQ 更新失败

Posted

技术标签:

【中文标题】PLINQ 更新失败【英文标题】:PLINQ update failed 【发布时间】:2010-08-19 11:47:26 【问题描述】:

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

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

请帮帮我

【问题讨论】:

为什么要向 DataTable 添加行? DataTables 旨在从数据库中检索数据。将数据放入强类型对象比编辑 DataTables 更好。 这只是一个小例子。当然,它的人工示例,我正在从数据库中获取行。这就是最后一行的全部内容。如何在 plinq 中更新数据表中的行 好的,我可以确认一下。它看起来不应该发生。试图了解更多。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

找到解决方案:

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

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

【讨论】:

以上是关于PLINQ 更新失败的主要内容,如果未能解决你的问题,请参考以下文章

并行LINQ PLinq

在 PLINQ 中绑定源线程

如何使用PLINQ

SVN更新失败,清理操作后更新依然会更新失败;

如何解决Android SDK Manager 更新失败

更新失败Windows 8.1 更新 (KB2919355)