C#におけるasync,awaitの動作の仕方をあまりイメージできていないでいます。
聞きたい点
- 非同期処理の流れ
質問
https://tech-lab.sios.jp/archives/15711
async,awaitを理解するために上記のサイトを参考に下のようなコードをサンプルとして用意してみました。
C#
1 class Program 2 { 3 static async Task Main(string[] args) 4 { 5 Task<string> task = HeavyMethod1(); 6 HeavyMethod2(); 7 Console.WriteLine(task.Result); 8 Console.ReadLine(); 9 } 10 11 static async Task<string> HeavyMethod1() 12 { 13 Console.WriteLine("すごく重い処理その1(´・ω・`)はじまり"); 14 await Task.Delay(5000); 15 Console.WriteLine("すごく重い処理その1(´・ω・`)おわり"); 16 17 for(int i = 0; i < 100; i++)//100秒ThreadSpeep 18 { 19 Thread.Sleep(1000); 20 Console.WriteLine(i + 1 + "秒経過"); 21 } 22 Console.WriteLine("すっごくまった"); 23 return "hoge"; 24 } 25 26 static void HeavyMethod2() 27 { 28 Console.WriteLine("すごく重い処理その2(´・ω・`)はじまり"); 29 Thread.Sleep(9000); 30 Console.WriteLine("すごく重い処理その2(´・ω・`)おわり"); 31 } 32 } 33} 34
処理の流れとして
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に処理が戻ると予想した)結果は違いました。
この結果をみると関数そのものが非同期で動いているような気がするのですが、
どなたかこのもやもやを解消する答えを頂けないでしょうか?
つたない文で申し訳ないです。
回答2件
あなたの回答
tips
プレビュー