タスクの開始と待機の違いは何ですか?

一人で

開始と待機の違いは何ですか?Stephen Clearyのブログから抜粋した以下のコード(コメントを含む)

public async Task DoOperationsConcurrentlyAsync()
{
  Task[] tasks = new Task[3];
  tasks[0] = DoOperation0Async();
  tasks[1] = DoOperation1Async();
  tasks[2] = DoOperation2Async();

  // At this point, all three tasks are running at the same time.

  // Now, we await them all.
  await Task.WhenAll(tasks);
}

タスクはあなたがそれらを待つときに実行を開始すると思いました...しかし、コード内のコメントはそうではないことを暗示しているようです。また、タスクをTask型の配列に関連付けた後、どのようにタスクを実行できますか。それは、本質的に行動を伴わない単なる帰属ではありませんか?

trashr0x

ATaskは「ホット」を返します(つまり、すでに開始されています)。が完了awaitするのTask非同期的に待機します。

あなたの例では、実際に実行する場所はawait、タスクを次々に実行するか、すべてを同時に実行するかに影響します

await DoOperation0Async(); // start DoOperation0Async, wait for completion, then move on
await DoOperation1Async(); // start DoOperation1Async, wait for completion, then move on
await DoOperation2Async(); // start DoOperation2Async, wait for completion, then move on

とは対照的に:

tasks[0] = DoOperation0Async(); // start DoOperation0Async, move on without waiting for completion
tasks[1] = DoOperation1Async(); // start DoOperation1Async, move on without waiting for completion
tasks[2] = DoOperation2Async(); // start DoOperation2Async, move on without waiting for completion

await Task.WhenAll(tasks); // wait for all of them to complete

更新

この例では(だけでなく)awaitasync操作を実行しません...同期のように動作しますか?DoOperation0Async()最初のケースでは他の何かを並行して実行できないため(!)。比較すると、2番目のケースDoOperation0Async()ではDoOperation1Async()並行して実行する(例:並行性、asyncの主な利点)」

これは大きなテーマであり、タスクの開始と待機の違いに関する元の質問とは異なるため、SOに関する独自のスレッドであるため、尋ねる価値のある質問です。したがって、この回答は短くし、必要に応じて他の回答を参照します。 。

いいえ、awaitINGのasync操作することは、同期のように振る舞うことはありません。これらのキーワードが行うことは、開発者が同期ワークフローに非同期コードを記述できるようにすることです(詳細については、Eric Lippertによるこの回答を参照してください)。

呼び出しawait DoOperation0Async() 、このコードフローを実行するスレッドをブロックませんが、の同期バージョンDoOperation0(またはのようなものDoOperation0Async.Result、操作が完了するまでスレッドをブロックします。

これについては、Webコンテキストで考えてください。リクエストがサーバーアプリケーションに到着したとしましょう。そのリクエストへの応答を生成する一環として、長時間実行される操作を実行する必要があります(たとえば、外部APIにクエリを実行して、応答の生成に必要な値を取得します)。この長時間実行操作の実行が同期している場合、リクエストを実行しているスレッドはブロックします長時間実行される操作が完了するまで待機する必要があるためです。一方、この長時間実行操作の実行が非同期の場合、要求スレッドを解放して、長時間実行操作の実行中に他のこと(他の要求の処理など)を実行できるようにすることができます。次に、長時間実行操作が最終的に完了すると、要求スレッド(またはスレッドプールからの別のスレッド)が中断したところから再開できます(長時間実行操作が完了し、その結果が利用可能になるため) )そして、応答を生成するために残された作業を実行します。

サーバーアプリケーションの例でasync- async/のawait主な利点についての質問の2番目の部分も取り上げていますこれは、スレッドの解放に関するものです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

開始時の静的参照変数とインスタンス参照変数の違いは何ですか?

分類Dev

待機/通知と待機/割り込みの違いは何ですか?

分類Dev

「asyncvoid」(待機なし)と「void」の違いは何ですか

分類Dev

hp-ux ps、スリープと待機の違いは何ですか?

分類Dev

別のタスクを待機する未開始のタスクを宣言するにはどうすればよいですか?

分類Dev

C ++とVisualC ++の違いと、C ++の開始方法は何ですか?

分類Dev

ScalazのタスクとIOの違いは何ですか?

分類Dev

タスクとスレッドの違いは何ですか?

分類Dev

Selenium WebDriverの暗黙の待機と明示的な待機の違いは何ですか?

分類Dev

カバルとスタックの違いは何ですか?

分類Dev

モックとスタブの違いは何ですか?

分類Dev

モックとスタブの違いは何ですか?

分類Dev

タイプとクラスの違いは何ですか?

分類Dev

モックとスタブの違いは何ですか?

分類Dev

スタートメニューから開始するコマンドプロンプトとエクスプローラーから直接開始するコマンドプロンプトの違いは何ですか?

分類Dev

タスクが開始されることもあれば、開始されないこともありますが、その理由は何ですか?

分類Dev

スクラムとアジャイル開発の違いは何ですか?

分類Dev

コールスタックとスタックの違いは何ですか?

分類Dev

非同期タスクとタスクの違いは何ですか

分類Dev

Rhinoモックのモックとスタブの違いは何ですか?

分類Dev

Rhinoモックのモックとスタブの違いは何ですか?

分類Dev

セクターとクラスターの違いは何ですか?

分類Dev

C#タスク。開始するまでの待機期間の遅延

分類Dev

Firebase Realtime Databaseで待機している前のタスクは、新しいタスクを開始する前に最初に完了する必要があります

分類Dev

gRPC クラスとベータ gRPC クラスの違いは何ですか?

分類Dev

Dockerの「公開」と「公開」の違いは何ですか?

分類Dev

VSTSのファイルのコピータスクとアーティファクトの公開タスクの違いは何ですか?

分類Dev

クラスとインスタンス属性の違いは何ですか?

分類Dev

Rust'sDropとC ++のデストラクタの違いは何ですか?

Related 関連記事

  1. 1

    開始時の静的参照変数とインスタンス参照変数の違いは何ですか?

  2. 2

    待機/通知と待機/割り込みの違いは何ですか?

  3. 3

    「asyncvoid」(待機なし)と「void」の違いは何ですか

  4. 4

    hp-ux ps、スリープと待機の違いは何ですか?

  5. 5

    別のタスクを待機する未開始のタスクを宣言するにはどうすればよいですか?

  6. 6

    C ++とVisualC ++の違いと、C ++の開始方法は何ですか?

  7. 7

    ScalazのタスクとIOの違いは何ですか?

  8. 8

    タスクとスレッドの違いは何ですか?

  9. 9

    Selenium WebDriverの暗黙の待機と明示的な待機の違いは何ですか?

  10. 10

    カバルとスタックの違いは何ですか?

  11. 11

    モックとスタブの違いは何ですか?

  12. 12

    モックとスタブの違いは何ですか?

  13. 13

    タイプとクラスの違いは何ですか?

  14. 14

    モックとスタブの違いは何ですか?

  15. 15

    スタートメニューから開始するコマンドプロンプトとエクスプローラーから直接開始するコマンドプロンプトの違いは何ですか?

  16. 16

    タスクが開始されることもあれば、開始されないこともありますが、その理由は何ですか?

  17. 17

    スクラムとアジャイル開発の違いは何ですか?

  18. 18

    コールスタックとスタックの違いは何ですか?

  19. 19

    非同期タスクとタスクの違いは何ですか

  20. 20

    Rhinoモックのモックとスタブの違いは何ですか?

  21. 21

    Rhinoモックのモックとスタブの違いは何ですか?

  22. 22

    セクターとクラスターの違いは何ですか?

  23. 23

    C#タスク。開始するまでの待機期間の遅延

  24. 24

    Firebase Realtime Databaseで待機している前のタスクは、新しいタスクを開始する前に最初に完了する必要があります

  25. 25

    gRPC クラスとベータ gRPC クラスの違いは何ですか?

  26. 26

    Dockerの「公開」と「公開」の違いは何ですか?

  27. 27

    VSTSのファイルのコピータスクとアーティファクトの公開タスクの違いは何ですか?

  28. 28

    クラスとインスタンス属性の違いは何ですか?

  29. 29

    Rust'sDropとC ++のデストラクタの違いは何ですか?

ホットタグ

アーカイブ