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

Parallel.ForEach() not getting expected results

在我的网络 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 左右,但每次都是可变的。这很奇怪。

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

发生这种情况的原因是因为 count++ 不是原子的。其实就是三个操作:取值,加1,再存回去。如果这三件事同时发生,事情就会变得混乱和不稳定。

在处理线程时,确保每个线程不处理相同的数据至关重要,否则它们会相互挤压。