【问题标题】:How to get next value when a common variable is increment in a parallel foreach?当公共变量在并行foreach中递增时如何获得下一个值?
【发布时间】:2017-10-30 11:12:39
【问题描述】:

我有一个在 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 中更新时是否有更新计数器以避免出现间隙和重复。

谢谢。

【问题讨论】:

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


【解决方案1】:

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 类型,则必须将其强制转换为 int

【讨论】:

  • 非常感谢您的回复。你能写一个例子吗?
  • 这个计数器的问题是,如果我没记错的话,那就是计数器在每个迭代器中都增加了。但是在我的情况下,只有当条件为真时,我才必须增加。
  • 你忘了 linq 在哪里!如果这不起作用,请尝试 Where ToList。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多