Parallel.ForEach () 대 foreach (IEnumerable).AsParallel ())
Erg, Reflector를 사용하여 BCL 에서이 두 가지 방법을 찾으려고하지만 찾을 수 없습니다. 이 두 스 니펫의 차이점은 무엇입니까?
ㅏ:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
비:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
하나를 다른 것보다 사용하면 다른 결과가 있습니까? (두 예제의 괄호로 묶은 몸체에서 내가하고있는 일은 스레드 안전하다고 가정하십시오.)
그들은 아주 다른 일을합니다.
첫 번째는 익명 대리자를 가져 와서 모든 다른 항목에 대해이 코드에서 여러 스레드를 병렬로 실행합니다.
두 번째는이 시나리오에서별로 유용하지 않습니다. 간단히 말해서 여러 스레드에서 쿼리를 수행하고 결과를 결합하여 호출 스레드에 다시 제공합니다. 따라서 foreach 문의 코드는 항상 UI 스레드에 유지됩니다.
linq 쿼리에서 AsParallel()
호출 오른쪽에 비싼 것을 수행하는 경우에만 다음 과 같이 의미가 있습니다.
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
차이점은 B는 평행하지 않다는 것입니다. LINQ 메소드를 사용할 때 병렬 변형이 사용되도록 유일한 것은 AsParallel()
을 감싸는 것 IEnumerable
입니다. 래퍼 GetEnumerator()
(의 장면 뒤에서 사용 foreach
)는 원래 컬렉션의 결과도 반환합니다 GetEnumerator()
.
당신은 반사경의 방법을보고 싶을 경우 BTW, AsParallel()
에 System.Linq.ParallelEnumerable
의 클래스 System.Core
조립. Parallel.ForEach()
에 mscorlib
조립 (네임 스페이스 System.Threading.Tasks
).
두 번째 방법은 예제에서 AsParallel ()을 사용하는 올바른 방법과 평행하지 않습니다.
IEnumerable<string> items = ...
items.AsParallel().ForAll(item =>
{
//Do parallel stuff here
});
참고 URL : https://stackoverflow.com/questions/3789998/parallel-foreach-vs-foreachienumerablet-asparallel
'Programming' 카테고리의 다른 글
ReSharper 약어 목록 : 어디서 수정할 수 있습니까? (0) | 2020.06.20 |
---|---|
nosetests가 내 인쇄 명세서의 출력을 캡처하고 있습니다. (0) | 2020.06.20 |
ld (linker) 검색 경로를 인쇄하는 방법 (0) | 2020.06.20 |
C에서 실행 파일의 위치를 어떻게 찾습니까? (0) | 2020.06.20 |
Golang에서 문자열을 분할하여 변수에 할당하는 방법은 무엇입니까? (0) | 2020.06.20 |