C# で同時プログラミングを実装する方法

1. マルチスレッド: アプリケーションが複数のスレッドを同時に実行できるようにする同時プログラミング テクノロジです。各スレッドには独自の命令セットとスタックがあり、異なる CPU コアで並行して実行することも、タイム スライスのローテーションによって 1 つの CPU コアで交互に実行することもできます。マルチスレッドの主な利点は、マルチコア プロセッサのパフォーマンスを活用できることですが、欠点は、スレッド間の同期や通信がより複雑になり、データ競合などの問題が発生する可能性があることです。

2. 非同期: ある操作の完了を待ってから別の操作を実行することなく、複数の操作を同時に実行できるようにするプログラミング パラダイムです。非同期操作は、コールバック関数、Promise、または言語の async/await 構文を通じて実装できます。非同期プログラミングの主な利点は、プログラムの応答性を向上させ、メイン スレッドのブロックを回避できることです。ネットワーク リクエスト、ファイルの読み取りと書き込みなど、I/O 集中型のタスクの処理に特に適しています。欠点は、コードロジックが複雑になり、コールバック地獄などの問題が発生する可能性があることです。

Async はマルチスレッドではありません非同期とマルチスレッドは異なるレベルの概念ですが、場合によっては連携して同時プログラミングを実現できます。

非同期は、タスクの実行中に常に CPU を占有するのではなく、I/O 操作が発生したときや他のイベントを待機しているときにハングし、非同期操作の完了後にタスクの実行を再開するプログラミング モデルです。このモデルは、特にネットワーク リクエストやファイルの読み書きなどの I/O 集中型のタスクを処理する場合に、プログラムの応答性と効率を向上させることができます。

マルチスレッドは、複数のスレッドを使用してタスクを同時に実行し、プログラムのパフォーマンスを向上させるもう 1 つの同時プログラミング モデルです。マルチスレッドは、マルチコア プロセッサのパフォーマンスを活用するため、CPU 集中型のタスクの処理に適しています。

場合によっては、非同期操作でマルチスレッドを活用して効率を向上させたり、マルチスレッド プログラムで非同期操作を使用してメインスレッドのブロックを回避したりするなど、非同期とマルチスレッドを併用できます。ただし、それらは直接的には同等ではなく、または互いに代替するものでもありません。

.NET によって提供される処理および同時プログラミングのメソッド:

  1. タスク並列ライブラリ (TPL) : TPL は、並列および同時コードを作成するための .NET Framework のライブラリです。並列プログラミングの複雑さを簡素化する一連の API とツールを提供します。Parallel.ForTPL はデータ並列処理とタスク並列処理をサポートし、 、などのメソッドを通じて並列ループと並列実行委任を実装Parallel.ForEachできます。Parallel.Invoke
  2. 並列 LINQ (PLINQ) : PLINQ は、データ コレクションに対して並列クエリ操作を実行できるようにする LINQ の並列バージョンです。PLINQ を使用すると、LINQ クエリを並列操作に変換できるため、パフォーマンスが向上します。
  3. バックグラウンド ワーカー: バックグラウンド ワーカーは、バックグラウンド スレッドで時間のかかる操作を実行するために使用される .NET のコンポーネントです。UI スレッドをブロックすることなく長時間実行タスクを実行でき、Windows フォームや WPF などのアプリケーションに適しています。
  4. スレッドとスレッド プール: .NET は、基礎となるスレッドとスレッド プールのサポートも提供します。System.Threading.Threadクラスを使用してスレッドを作成および管理したり、System.Threading.ThreadPoolスレッド プール リソースを利用して並列操作を実行したりできます。
  5. Async/Await : 非同期プログラミングは並行性に対処するもう 1 つの方法であり、メイン スレッドのブロックを回避し、アプリケーションの応答性を向上させることができます。.NET では、async/await非同期メソッドとキーワードを使用して非同期プログラミングを実現できます。非同期メソッドは、新しいスレッドを作成せずに長時間実行タスクを実行できますが、非同期 IO やタスクなどのメカニズムを通じてノンブロッキング実行を実現します。
  6. Dataflow : Dataflow は、メッセージベースの並列分散アプリケーションを構築するために .NET 4.5 で導入されたライブラリです。メッセージ プロデューサとコンシューマの作成に使用できる一連のブロック タイプを提供し、データフロー グラフを介した並列実行とメッセージ配信を実装します。
  7. ** ロックフリーおよびウェイトフリーのデータ構造 **: .NET では、ロックフリーおよびウェイトフリーのデータ構造を使用して、高パフォーマンスの同時プログラミングを実現することもできます。これらのデータ構造により、ロックやその他の同期メカニズムを使用せずに、複数のスレッドが共有リソースに同時にアクセスできます。

実装:

1. List<タスク> を使用する

List<Task> tasks = new List<Task>();
foreach (string model in models.Split(','))
{
    string read_file_name = $"{model}-BOX-{dateTime.ToString("yyyyMMdd")}.csv";
    string write_file_name = $"{model}-BOX数据生成-{dateTime.ToString("yyyyMMdd")}.csv";
    tasks.Add(Task.Run(() => { ReadWriteFile(read_file_name,write_file_name); }));
}
Task.WaitAll(tasks.ToArray());//等待List里的Task任务全部执行完成,防止阻塞

おすすめ

転載: blog.csdn.net/weixin_50478033/article/details/133129963