[c#] Parallel.ForEach 대 Task.Run 및 Task.WhenAll



Answers

첫 번째 버전은 호출 스레드를 동기식으로 차단하고 일부 스레드를 실행합니다.
UI 스레드 인 경우 UI가 고정됩니다.

두 번째 버전은 스레드 풀에서 비동기 적으로 작업을 실행하고 완료 될 때까지 호출 스레드를 해제합니다.

또한 사용 된 스케줄링 알고리즘에도 차이가 있습니다.

두 번째 예제는 다음과 같이 단축 될 수 있습니다.

await Task.WhenAll(strings.Select(s => Task.Run(() => DoSomething(s)));
Question

Parallel.ForEach 또는 Task.Run ()을 사용하여 비동기 적으로 작업 세트를 시작하는 것의 차이점은 무엇입니까?

버전 1 :

List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
    DoSomething(s);
});

버전 2 :

List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
    Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);



Related