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

时间:2013-02-23 07:55:09

标签: c# asp.net visual-studio-2010

编码

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中找到的数据表foreach列表。有这个错误说我已经有一个数据流因此无法添加。我现在卡住了,有人可以帮助我。

3 个答案:

答案 0 :(得分:2)

你有一个共享资源,你的行计数器。您需要同步访问共享资源。另一方面,数据表是NOT thread safe for write operations。因此,您还需要syncronize访问您的数据表。

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

答案 1 :(得分:0)

而不是

staffdr = staffdt.NewRow();

使用

var staffdr = staffdt.NewRow();
由于并行性,

也会使rownum不正确

答案 2 :(得分:0)

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

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