2017-10-29 4 views
0

Ich habe eine gemeinsame Variable, die innerhalb einer foreach aktualisiert wird, es ist ein Zähler, also möchte ich den nächsten Zähler innerhalb einer parallelen foreach zugewiesen bekommen.Wie erhält man den nächsten Wert, wenn eine gemeinsame Variable in einer parallelen foreach inkrementiert wird?

Ich habe so etwas wie das:

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

Ich will Lücken in Immobilien iterator.Position vermeiden und Duplikate zu vermeiden.

Ich habe ein Beispiel gesehen, das die Summe der Teilergebnisse, for example in this documentation, tut, aber es ist nicht wirklich der gleiche Fall, den ich brauche.

Also ich würde gerne wissen, ob es irgendwelche weg zu aktualisieren einen Zähler, um Lücken und Duplikate zu vermeiden, wenn ich innerhalb der parallelen foreach aktualisiert.

Danke.

+4

[ 'Interlocked.Increment'] (https://docs.microsoft.com/dotnet /api/system.threading.interlocked.increment) – PetSerAl

Antwort

4

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

Sie sollten das anstelle des manuellen Zählers verwenden. Es hat keine Duplikate. Es hat auch keine Lücken, es sei denn, Sie stoppen die Schleife aus irgendeinem Grund.

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

Hinweis ist, dass Zähler lange geben, so dass Sie es werfen müssen int, wenn Position des int-Typ ist

+0

Vielen Dank für Ihre Antwort. Könntest du ein Beispiel schreiben? –

+0

Siehe Update –

+0

Das Problem mit diesem Zähler ist, wenn ich nicht falsch liege, dass der Zähler in jedem Iterator erhöht wird. In meinem Fall muss ich jedoch nur erhöhen, wenn die Bedingung wahr ist. –

Verwandte Themen