2

ただ読んで声を出して考えてください:awaitメインUIスレッド内からメソッドの呼び出しを使用した場合、UIスレッドを呼び出すスレッドがないため、それはブロッキング呼び出しに相当しますか?

例えば:

int Main()
{
    // This would be a blocking call, right?
    await PrintTwoMillionTimes("Hello");

    Console.WriteLine("Phew! Done!");
}
4

2 に答える 2

5

いいえ; 重要なのawaitは、それがブロッキング呼び出しではないということです。
コンパイラは、後のコードをawaitコールバックに変換します。

あなたが待っているものが行儀が良い(つまり、同期して動作しない)限り、UIは問題ありません。

于 2013-01-23T13:20:20.670 に答える
4

いいえ、絶対にありません。

ポイントawaitは、ブロックしないことです。の結果が適切に動作すると仮定するとPrintTwoMillionTimes、asyncメソッドはすぐに戻ります...ただし、結果が完了したときにメソッドの残りの部分が(UIスレッドで)実行されるように継続をアタッチします。

したがって、実用的な例があると仮定すると(現在、メソッド宣言はではなくasync、を返しint、ステートメントはありませんreturn...)、フローは次のようになります。

  • 非同期メソッドが開始します
  • PrintTwoMillionTimesが呼び出され、非同期操作が開始され、操作を表すものが返されます(例Task:)
  • 生成されたコードは、操作がすでに完了しているかどうかをチェックします。
    • すでに完了している場合は、実行を続行します
    • それ以外の場合は、継続がタスク(または操作を表すもの)に付加され、asyncメソッドは

Taskasyncメソッドに戻る場合、またはasyncメソッドから戻るTask<T>場合、戻り値を使用して、asyncメソッド自体がいつ完了したか(つまり、Console.WriteLine実行した後)を示すことができます。

もちろん、これは非常に簡単な説明です。あなたは本当にasync/awaitについてもっと詳しく読むべきです。MSDNは妥当な出発点です。

于 2013-01-23T13:21:21.103 に答える