この記事では、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
エラー処理次の場合に を使用します。Task.Run
Task.WhenAll
I/O バウンドのタスクが関係しています。Parallel.ForEach
Task.Run
タスクの管理、キャンセル、同期をきめ細かく制御する必要があります。Task.WhenAll
以上がタスクと並列の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。