2017-10-29 6 views
0

私は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の内部を更新したときに、ギャップや重複を避けるためにカウンタを更新する必要があるかどうかを知りたいと思います。

ありがとうございました。

+4

であればint型にキャストする必要があるので、カウンタが長いのタイプであることに注意してください[ 'Interlocked.Increment'](https://docs.microsoft.com/dotnet /api/system.threading.interlocked.increment) – PetSerAl

答えて

4

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; 
}); 

あなたは位置がint型

+0

お返事ありがとうございました。例を書くことができますか? –

+0

更新 –

+0

を参照してください。このカウンタの問題は、間違っていなければ、各イテレータでカウンタが増加していることです。しかし私の場合は、条件が満たされているときだけ増やさなければなりません。 –

関連する問題