Parallel.ForEach()没有得到预期的结果

时间:2017-03-31 17:34:46

标签: c# parallel.foreach

在我的web api控制器中,我使用Parallel.ForEach()循环遍历列表。我有一个计数器,我在Parallel.ForEach代码中递增。我每次运行计数器时都注意到计数器是一个变量数,并且它永远不会像我用Parallel.ForEach()循环遍历的列表一样高。似乎Parallel.ForEach()在完成循环遍历所有元素之前不等待回来。

// get all the new records from the csv
var newData = csv.GetRecords<MyEFTable>().ToArray();
int count = 0;
Parallel.ForEach(newData, (d) => {
  count++});

newData有6588项,计数一般在3400左右,但每次都是变量。这很奇怪。

1 个答案:

答案 0 :(得分:6)

你正处于竞争状态。您需要使用var newCount = Interlocked.Increment(ref count);在多线程环境中安全地增加变量。 newCount变量是增量计数器。

发生这种情况的原因是因为count++不是原子的。它实际上是三个操作:获取值,添加1,然后将其存储回来。如果你同时发生这三件事情,那么事情就会发生故障并且不稳定。

在处理线程时,确保每个线程不会操纵相同的数据,或者它们会相互压缩是至关重要的。