2017-10-29 11 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

['Interlocked.Increment'] (https://docs.microsoft.com/dotnet의 경우 int로 캐스팅 할 수 있도록 긴의 유형 /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

을 참조하십시오.이 카운터의 문제점은, 잘못 아니었다면 각 반복기에서 카운터가 증가한 것입니다. 그러나 제 경우에는 조건이 사실 일 때만 늘려야합니다. –