C# 5から、async-await構文が使えるようになった。
await 演算子 - C# リファレンス | Microsoft Docs
非同期メソッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
awaitを付けた時の動きがわかりにくいので、まとめる。
MainClass.csで、
// 名前空間の登録 using System; // 共通データ型と基本クラス(System名前空間) using System.Threading; // マルチスレッド(System.Threading名前空間) using System.Threading.Tasks; // タスク(System.Threading.Tasks名前空間) // MainClassの定義 class MainClass { // Mainの定義 static void Main() { // 実行前 Console.WriteLine("Main Begin"); // "Main Begin"と出力. // SimpleMethodを実行. SimpleMethod(); // SimpleMethodを呼ぶ. // SimpleMethodを抜けた後. Console.WriteLine("SimpleMethod After"); // "SimpleMethod After"と出力. // 10秒待つ. Thread.Sleep(10000); // 10000ミリ秒休止. // 実行後 Console.WriteLine("Main End"); // "Main End"と出力. } // SimpleMethodの定義 static void SimpleMethod() { // 実行前 Console.WriteLine("SimpleMethod Begin"); // "SimpleMethod Begin"と出力. // Task.Runで指定のActionを実行. Task.Run(() => { // LongProcMethod実行前 Console.WriteLine("LongProcMethod Before"); // "LongProcMethod Before"と出力. // LongProcMethodを実行. LongProcMethod(); // LongProcMethodを呼ぶ. // LongProcMethod実行前 Console.WriteLine("LongProcMethod After"); // "LongProcMethod After"と出力. }); // 実行後 Console.WriteLine("SimpleMethod End"); // "SimpleMethod End"と出力. } // LongProcMethodの定義 static void LongProcMethod() { // 実行前 Console.WriteLine("LongProcMethod Begin"); // "LongProcMethod Begin"と出力. // 5秒休止で疑似的に長くかかる処理にする. Thread.Sleep(5000); // 5000ミリ秒休止. // 実行後 Console.WriteLine("LongProcMethod End"); // "LongProcMethod End"と出力. } }
SimpleMethodの中で、Task.Runで、LongProcMethodを実行する。
この場合は、
この状態で5秒待つ。
この時、"SimpleMethod After"も"SimpleMethod End"も通っている。
5秒が終わったらこうなって、
最終的にはこうなる。
Task.Runのような非同期処理にawaitを付けて、
このようにする。awaitが中で使われているメソッドはasyncを付けないといけない。
このメソッドは非同期処理ですよという印。
今度は"SimpleMethod End"が呼ばれていない。
実は、awaitの部分でいったんメソッドを抜けている。
awaitの下の部分はawaitで指定した非同期処理(ここで言えばTask.Runで指定した処理)が終わってから再開される。
ただし、SimpleMethodの外のすぐ下の、"SimpleMethod After"の部分は通っている。
5秒後、"SimpleMethod End"にようやく来てる。
最後はこう。
awaitは、例えばGUIのButtonを押した時に重い処理を実行しつつ、Button自体は固まらないようにしたい場合に役立つ。
重い処理が終わるのを待ってWaitしたらButtonが固まる。とはいえ処理を待ってから別の処理は実行したいそんな場合である。
awaitはそういった非同期処理を同期的に書ける。
Sample/cs/await/await/src/await at master · bg1bgst333/Sample · GitHub