이 문서에서는 C#에서 Parallel.ForEach
과 Task
계열(구체적으로 Task.WhenAll
, Task.Run
등) 간의 주요 차이점을 살펴봅니다. 둘 다 동시 또는 병렬 코드 실행을 용이하게 하지만 애플리케이션, 동작 및 작업 처리가 크게 다릅니다.
Parallel.ForEach:
네임스페이스의 멤버인 Parallel.ForEach
System.Threading.Tasks
은 컬렉션에 대한 병렬 반복을 가능하게 합니다. 스레드 풀 내의 사용 가능한 스레드 전체에 워크로드를 자동으로 분산시켜 CPU 바인딩 작업에 대한 효율성이 매우 높습니다.
주요 기능:
예:
<code class="language-csharp">using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Parallel.ForEach(items, item => { // Simulate CPU-intensive task (e.g., complex calculation) Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}"); }); Console.WriteLine("All items processed."); } }</code>
작업(Task.Run, Task.WhenAll):
Task.Run
및 Task.WhenAll
는 비동기 및 병렬 실행에 대한 세부적인 제어를 제공합니다. Task.Run
는 CPU 바인딩 작업을 오프로드할 수 있지만 I/O 바인딩 작업을 위한 비동기 코드와 자주 결합됩니다.
주요 기능:
Task.WhenAll
, Task.WhenAny
사용).Task.Run
는 비동기 동작이 필요한 시나리오에 탁월합니다.예:
<code class="language-csharp">using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Parallel.ForEach(items, item => { // Simulate CPU-intensive task (e.g., complex calculation) Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}"); }); Console.WriteLine("All items processed."); } }</code>
Feature | Parallel.ForEach | Task.Run / Task.WhenAll |
---|---|---|
Primary Use Case | Parallel iteration for CPU-bound tasks. | Asynchronous and parallel execution (CPU/I/O). |
Thread Control | Less control; uses the thread pool. | Full control over task creation and execution. |
Execution Type | Synchronous (blocking). | Asynchronous (non-blocking unless awaited). |
Task Type | CPU-bound tasks (parallel for loop). | General-purpose tasks (CPU-bound or I/O-bound). |
Parallelism | Parallelism | Parallel or asynchronous. |
Error Handling | Exceptions thrown per iteration. |
Task.WhenAll aggregates exceptions. |
Performance | Automatic performance tuning. | Manual task distribution management. |
를 사용하십시오
Parallel.ForEach
는 최소한의 제어가 필요한 간단한 CPU 바운드 작업에 적합합니다. 및 Task.Run
는 더 큰 유연성을 제공하여 CPU 바운드 및 I/O 바운드 작업 모두에 이상적이어서 동시성과 평행을 세밀한 제어와 조합 할 수있게합니다. Task.WhenAll
위 내용은 작업 및 병렬의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!