1
  try 
     { 
      ParallelOptions Options = new ParallelOptions(); 
      Options.CancellationToken = base.DownloadCancellation.Token; 
      Parallel.ForEach(base.BlockingCollection1, Options, ActiveSeeder => 
       { 
        //... 
       }); 
     } 
     catch 
     { 
      if (base.DownloadCancellation.IsCancellationRequested) 
       return false; 
     } 

Parallel.Foreach/For는 BlockingCollection1.Take 함수를 호출합니까? CancellationToken을 사용하거나 사용하지 않고 ParallelOptions에 넣었습니까?Parallel.Foreach/For는 BlockingCollection을 어떻게 호출합니까? Take? with or CancellationToken

확인할 기회가 있습니까?

답변

4

Parallel.ForEach() 않습니다. 아니요.으로 전화하십시오. 귀하의 질문은 유효하지 않으므로, Take()으로 전화하십시오.

대신 컬렉션을 다른 IEnumerable<T>처럼 처리합니다. 즉, GetEnumerator()을 호출 한 다음 그 결과로 작업 할 것입니다. What GetEnumerator() does for BlockingCollection is documented :

GetConsumingEnumerable 달리, BlockingCollection<T>.IEnumerable<T>.GetEnumerator 내부 컬렉션을 수정하지 않는 표준 열거를 돌려줍니다. GetEnumerator이 호출 될 때 다른 스레드가 동시에 요소를 추가하거나 제거하는 경우 열거 자에 의해 반환 된 요소가 컬렉션의 현재 상태를 나타내지 않을 수 있습니다. 당신은 당신이 반복으로 컬렉션에서 항목을 제거하려면

, 당신은 an overload that takes CancellationToken을 않는, GetConsumingEnumerable()를 사용할 수 있습니다. 하지만 실제로는 잘 작동하지 않으므로 GetConsumingPartitioner() from ParallelExtensionsExtras을 사용하는 것이 좋습니다.

+0

감사합니다. 잘자 –

관련 문제