URL 목록을 가져와 추가 처리를 위해 각각을 다운로드하는 Parallel.ForEach() 루프가 있습니다. 내 루프 밖에서 루프 카운터 변수를 선언하고 내부에서 Interlocked.Increment()를 사용하면 각 루프 인터레이션이 수행 될 때 "스레드를 안전하게"유지하는 최선의 방법이라고 생각합니다.Interlocked.Increment()가 작업 병렬 라이브러리에서 기대했던 방식대로 작동하지 않습니다.
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment(ref counter);
Debug.WriteLine(" ......... counter: " + counter);
});
가 나는 비슷한 볼 것이라고 생각했을 것이다
:
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
하지만 제가 대신 얻는 것은 16 "......... 0"(이 내가 때문이다 듀얼 쿼드 코어 컴퓨터에 8 개의 기본 코어가 있지만 하이퍼 스레딩을 사용할 수 있으므로 총 16 개의 코어가 제공됩니다.) 그런 다음 카운터가 정상적으로 증가하는 것을 보게 될 것이지만 때로는 디버그 출력에 카운터 값이 중복되거나 심지어 세 개나 표시됩니다.
Parallel.ForEach()를 사용하면 루프 반복 횟수를 계산하는 가장 좋은 방법은 무엇입니까? 어떤 조언을 주셔서 감사합니다.
중복 값이 예상됩니다. 그러나 나는 0이 어디서 왔는지 이해하지 못합니다. – CodesInChaos
해결 방법은 int 'myCounter = Interloced.Increment (ref 카운터)를 사용하고 있습니다. Debug.WriteLine (myCounter); ' – CodesInChaos
문제를 실제로 컴파일하고 표시하는 코드 (예 : 0을 인쇄)를 게시 할 수 있습니까? – CodesInChaos