我有一个在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内部更新时出现间隙和重复。
感谢。
答案 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