如何将数据行值添加到arraylist的Parallel.Foreach循环中

本文关键字:arraylist Parallel Foreach 循环 添加 数据 | 更新日期: 2023-09-27 18:00:35

编码:

int rownum = 1;
Parallel.ForEach(listofstaffuid.Cast<object>(), staffuid =>
{
string staffname = dbmanager.GetNameViaUserID(staffuid.ToString());
staffdr = staffdt.NewRow();
staffdr["No"] = rownum;
staffdr["StaffName"] = staffname;
staffdr["RadioList"] = listofradio;
staffdr["RemarkTbx"] = string.Empty;
staffdt.Rows.Add(staffdr);
rownum++;
});

我只想把我的数据表添加到我在数组列表中找到的每个列表中。有一个错误说我已经有了一个数据行,因此无法添加。我现在被卡住了,有人能帮我吗?

如何将数据行值添加到arraylist的Parallel.Foreach循环中

您有一个共享资源,即行计数器。您需要同步对共享资源的访问。另一方面,数据表对于写操作来说不是线程安全的。因此,您也需要同步对数据表的访问。

唯一不需要同步的东西(也许,这是你的职责)是你的GetNameViaUserID函数。这个功能需要很长时间吗?如果是这样,那么可能值得尝试并行获取该函数的所有结果,然后使用结果顺序填充数据表。如果根本不需要任何时间,那么在这里使用并行处理就没有意义了,因为你需要同步你的整个代码块,这意味着你的foreach无论如何都是顺序的。

而不是

staffdr = staffdt.NewRow();

使用

var staffdr = staffdt.NewRow();

此外,由于的并行性,rownum也将不正确

在Parallel.X中使用计数器时,必须使用线程安全的方式递增计数器,例如Interlock.Increment.

此外,如果您使用的字段或变量已在并行操作之外定义,则会遇到竞争条件。总是尽量减少对并行操作外部世界的依赖(至少从写作的角度来看,或者使用Concurrent对象(ConcurrentBag…))。