ただ読んで声を出して考えてください:await
メインUIスレッド内からメソッドの呼び出しを使用した場合、UIスレッドを呼び出すスレッドがないため、それはブロッキング呼び出しに相当しますか?
例えば:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
ただ読んで声を出して考えてください:await
メインUIスレッド内からメソッドの呼び出しを使用した場合、UIスレッドを呼び出すスレッドがないため、それはブロッキング呼び出しに相当しますか?
例えば:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
いいえ; 重要なのawait
は、それがブロッキング呼び出しではないということです。
コンパイラは、後のコードをawait
コールバックに変換します。
あなたが待っているものが行儀が良い(つまり、同期して動作しない)限り、UIは問題ありません。
いいえ、絶対にありません。
ポイントawait
は、ブロックしないことです。の結果が適切に動作すると仮定するとPrintTwoMillionTimes
、asyncメソッドはすぐに戻ります...ただし、結果が完了したときにメソッドの残りの部分が(UIスレッドで)実行されるように継続をアタッチします。
したがって、実用的な例があると仮定すると(現在、メソッド宣言はではなくasync
、を返しint
、ステートメントはありませんreturn
...)、フローは次のようになります。
PrintTwoMillionTimes
が呼び出され、非同期操作が開始され、操作を表すものが返されます(例Task
:)Task
asyncメソッドに戻る場合、またはasyncメソッドから戻るTask<T>
場合、戻り値を使用して、asyncメソッド自体がいつ完了したか(つまり、Console.WriteLine
実行した後)を示すことができます。
もちろん、これは非常に簡単な説明です。あなたは本当にasync/awaitについてもっと詳しく読むべきです。MSDNは妥当な出発点です。