タスクと並列

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-26 12:03:09780ブラウズ

Task and Parallel

この記事では、C# における Parallel.ForEachTask ファミリー (具体的には Task.WhenAllTask.Run など) の主な違いについて説明します。どちらもコードの同時実行または並列実行を容易にしますが、アプリケーション、動作、タスク処理は大きく異なります。

Parallel.ForEach:

Parallel.ForEach は、System.Threading.Tasks 名前空間のメンバーであり、コレクションの並列反復を可能にします。スレッド プール内の利用可能なスレッド間でワークロードを自動的に分散し、CPU バウンドの操作に対して非常に効率的であることが証明されています。

主な機能:

  • 並列実行: 反復は複数のスレッドで同時に実行されます。
  • スレッド プールの依存性: スレッド プールを利用します。スレッドの作成や存続期間を直接管理することはできません。
  • 同期操作 (デフォルト): コレクション全体が処理されるまで実行をブロックします。
  • CPU バウンド タスクの最適化: スレッドが独立して動作する 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.RunTask.WhenAll は、非同期および並列実行をきめ細かく制御できます。 Task.Run は CPU に依存する作業をオフロードできますが、I/O に依存するタスクの非同期コードと組み合わせて使用​​されることがよくあります。

主な機能:

  • 非同期実行: タスクは主に非同期プログラミング、特に I/O バウンド操作 (ネットワーク呼び出し、データベース アクセス) を処理します。
  • タスク管理: タスクは手動で作成、管理され、待機されます (Task.WhenAllTask.WhenAny を使用)。
  • 柔軟性の強化: タスクは個別またはグループで作成および管理できるため、きめ細かい制御が可能です。
  • I/O バウンド タスクの最適化: CPU バウンドのタスクにも使用できますが、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>

主な違いの要約:

機能 Parallel.ForEach Task.Run / Task.WhenAll
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.
主な使用例
CPU バウンドのタスクの並列反復。 非同期および並列実行 (CPU/I/O)。

スレッド制御

制御が少なくなります。スレッド プールを使用します。 タスクの作成と実行を完全に制御します。 実行タイプ 同期 (ブロッキング)。 非同期 (待機しない限り非ブロッキング)。
    タスクの種類
CPU に依存するタスク (並列 for ループ)。 汎用タスク (CPU バウンドまたは I/O バウンド)。

並列処理

並列処理 並列または非同期。 Parallel.ForEachエラー処理 反復ごとにスローされる例外。 は例外を集約します。
    パフォーマンス
自動パフォーマンス調整。 手動タスク分散管理。 テーブル>
  • 適切なツールの選択:
  • 次の場合に を使用します。Task.RunTask.WhenAll

    独立した作業単位に分割できる CPU バウンドのタスクがあります。
    • 複数のスレッドにわたる自動並列化が必要です。
    • 同期実行は許容されます。
  • 次の場合に
    /

    を使用します。

    I/O バウンドのタスクが関係しています。Parallel.ForEach Task.Runタスクの管理、キャンセル、同期をきめ細かく制御する必要があります。Task.WhenAll

    並列処理と非同期処理を組み合わせる必要があります。 結論: は、最小限の制御を必要とする単純な CPU 依存タスクに最適です。 と は柔軟性が高く、CPU バウンドと I/O バウンドの両方のタスクに最適であり、きめ細かい制御による同時実行性と並列性の組み合わせが可能になります。

    以上がタスクと並列の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。