Parallel.ForEach () 대 foreach (IEnumerable <T> .AsParallel ())


143

어그, 리플렉터를 사용하여 BCL 에서이 두 가지 방법을 찾으려고하지만 찾을 수 없습니다. 이 두 스 니펫의 차이점은 무엇입니까?

ㅏ:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

비:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

하나를 사용하면 다른 결과가 있습니까? (두 예제의 괄호 본문에서 내가하고있는 일은 스레드 안전하다고 가정합니다.)

답변:


148

그들은 아주 다른 일을합니다.

첫 번째는 익명 대리자를 가져 와서 모든 다른 항목에 대해이 코드에서 여러 스레드를 병렬로 실행합니다.

두 번째 시나리오는이 시나리오에서별로 유용하지 않습니다. 간단히 말해서 여러 스레드에서 쿼리를 수행하고 결과를 결합하여 호출 스레드에 다시 제공합니다. 따라서 foreach 문의 코드는 항상 UI 스레드에 유지됩니다.

linq 쿼리에서 AsParallel()호출 오른쪽에 비싼 것을 수행하는 경우에만 다음 과 같이 의미가 있습니다.

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));

컴퓨 트 피보나치에서 병렬 foreach를 수행 할 때의 이점은 무엇입니까?
l --''''''--------- '' '' '' '' '' '' ''

51

차이점은 B는 평행하지 않다는 것입니다. LINQ 메소드를 사용할 때 병렬 변형이 사용되도록 유일한 것은 AsParallel()을 감싸는 것 IEnumerable입니다. 래퍼 GetEnumerator()(의 장면 뒤에서 사용 foreach)는 원래 컬렉션의 결과를 반환합니다 GetEnumerator().

당신은 반사경의 방법을보고 싶을 경우 BTW, AsParallel()System.Linq.ParallelEnumerable의 클래스 System.Core조립. Parallel.ForEach()mscorlib조립 (네임 스페이스 System.Threading.Tasks).


평행 변형이 사용되는 것은 무엇입니까?
l --''''''--------- '' '' '' '' '' '' ''

2
@punctuation 예를 들어, 쓸 때 normal이 아니라 .Select()호출 ParallelEnumerable.Select()합니다 Enumerable.Select().
svick

50

두 번째 방법은 예제에서 AsParallel ()을 사용하는 올바른 방법과 평행하지 않습니다.

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});

3
왜 foreach 대신 asparallel과 forall을 함께 사용합니까?
l --''''''--------- '' '' '' '' '' '' ''
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.