質問: 0; i < 100; i++)//100秒ThreadSpeep { Thread.Sleep(1000); Console.WriteLine(i + 1 + "秒経過"); } Console.WriteLine("すっごくまった"); return "hoge"; } static void HeavyMethod2() { Console.WriteLine("すごく重い処理その2( ́・ω・`)はじまり"); Thread.Sleep(9000); Console.WriteLine("すごく重い処理その2( ́・ω・`)おわり"); } } } ``` 処理の流れとして 1.HeavyMethod1(以下HM1)が実行される 2.await Task.Delay(5000)で非同期処理開始 メソッドを抜ける 3.HeavyMethod2(以下HM2)が実行される 4.HM2のスリープ中にHM1のDelayが完了する HM1に処理が移る ここまでは理解できます。 ここで、4でHM1に処理が移ったあとに、HM1でawaitを使わずに同期的な重い処理 があった場合、その処理が終わるまでHM2はどうなるのだろうと思い、HM1に100秒スリープする処理を追加しています。 結果をいうと、3秒経過時点でHM2の「すごく~おわり」の出力が挟まれます。 その後に4秒経過,5秒経過と続いていきます。 予想では、非同期処理するのはawaitの行なのでそれ以外は同期処理すると思ったですが、 (つまり100秒経過後にHM2に処理が戻ると予想した)結果は違いました。 この結果をみると関数そのものが非同期で動いているような気がするのですが、 どなたかこのもやもやを解消する答えを頂けないでしょうか? つたない文で申し訳ないです。
回答: >この結果をみると関数そのものが非同期で動いているような気がするのですが、 その通りです。 await は、非同期メソッドの「完了を待ち」を行うための構文です。