ただ読んで声を出して考えてください: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:)Taskasyncメソッドに戻る場合、またはasyncメソッドから戻るTask<T>場合、戻り値を使用して、asyncメソッド自体がいつ完了したか(つまり、Console.WriteLine実行した後)を示すことができます。
もちろん、これは非常に簡単な説明です。あなたは本当にasync/awaitについてもっと詳しく読むべきです。MSDNは妥当な出発点です。