本文探討了 C# 中 Parallel.ForEach
和 Task
系列(特別是 Task.WhenAll
、Task.Run
等)之間的主要差異。兩者都有助於並發或並行程式碼執行,但它們的應用程式、行為和任務處理有很大不同。
並行.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
錯誤處理在以下情況下使用 :Task.Run
Task.WhenAll
涉及 I/O 密集型任務。 Parallel.ForEach
Task.Run
需要對任務管理、取消或同步進行精細控制。 Task.WhenAll
以上是任務與平行的詳細內容。更多資訊請關注PHP中文網其他相關文章!