当并行foreach中的公共变量增加时,如何获取下一个值?

时间:2017-10-29 19:46:06

标签: c# task-parallel-library parallel.foreach

我有一个在foreach中更新的公共变量,它是一个计数器,所以我想让下一个计数器在并行foreach中分配。

我有类似的东西:

int myCommonCounter = 5;
Parallel.Foreach(myList, (iterator, state) =>
{
    if(iterator.MyProperty == X)
    {
        iterator.Position = miCommonCounter;
        miCommonCounter = miCommonCunter + 1;
    }
});

我想避免在属性iterator.Position中出现间隙,并避免重复。

我已经看到一个例子来处理部分结果for example in this documentation的总和,但它与我需要的情况并不相同。

所以我想知道是否有任何更新计数器以避免在并行foreach内部更新时出现间隙和重复。

感谢。

1 个答案:

答案 0 :(得分:5)

The overload of Parallel foreach that has 3 parameters for lambda argument has counter already

您应该使用它而不是编写手动计数器。它没有重复。除非你出于某种原因停止循环,否则它不会有间隙。

Parallel.ForEach(source.Where(x => /*condition*/), (x, state, counter) =>
{
     iterator.Position = (int) counter;
});

请注意,counter是long类型,因此如果Position是int type

,则必须将其强制转换为int