1

编码:

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++;

});

我只想添加我在数组列表中找到的数据表 foreach 列表。有这个错误说我已经有一个数据行因此无法添加。我现在卡住了,有人可以帮助我。

4

3 回答 3

2

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

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

于 2013-02-23T08:05:56.787 回答
0

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

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

于 2013-02-23T08:06:44.207 回答
0

代替

staffdr = staffdt.NewRow();

利用

var staffdr = staffdt.NewRow();

由于并行性,rownum 也不正确

于 2013-02-23T08:01:19.537 回答