web-dev-qa-db-ja.com

C#での非同期/待機と並列

C#でasync/awaitをいつ使用し、parallel.foreachをいつ使用すればよいですか?並列と非同期/待機は同じ目的を果たしますか?それらの違いは何ですか?

37
AUser123

async/awaitは約非同期ですが、Parallel.ForEachは約並列処理です。それらは関連する概念ですが、同じではありません。

Parallel.ForEachは、コレクション内のすべてのアイテムに対して同じ操作を並行して実行し、すべての操作が完了するまで現在のスレッドをブロックする場合に使用されます。

async/awaitは、特定の非同期操作が完了するまで現在の操作がこれ以上進行できないが、現在のスレッドをブロックしたくない場合に使用されます。これは、次の2つの状況で特に役立ちます。

  • 基本的に、UIスレッドでさまざまな非同期操作を次々に開始するコードを記述し、操作の合間にUIに短時間アクセスします。 (それはもっと一般的ですが、それは簡単な例です。)UIスレッドをブロックしたくないのですが、それ以外の非同期操作をすべて管理するのは面倒です。
  • 処理lots一度に長時間実行される操作-たとえばWebサーバー内。個々のリクエストは、他のWebサービス、データベースなどを呼び出すために時間がかかる場合がありますが、スレッドは比較的高価なリソースであるため、リクエストごとに1つのスレッドを使用することは望ましくありません。

Parallel.ForEachを呼び出す新しいタスクを開始し、そのタスクを待機することで、並列処理と非同期を組み合わせることができます。 (ちょうど一例として。)

100
Jon Skeet