Task.Delayは、指定したミリ秒後に完了するタスクを作成する。
Task.Delay メソッド (System.Threading.Tasks) | Microsoft Docs
Task.Delay メソッドの謎
作成するとしか書いてないが、実際は実行されてるはず(?)で、その実行をawaitすることで、Sleepみたいな待ち状態を作ることが出来る。
Sleepであれば、
// 名前空間の登録 using System; // 共通データ型と基本クラス(System名前空間) using System.Threading; // マルチスレッド(System.Threading名前空間) // 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"と出力. // 5秒待つ. Thread.Sleep(5000); // 5000ミリ秒休止. // 実行後 Console.WriteLine("SimpleMethod End"); // "SimpleMethod End"と出力. } }
こうすると、
最初はこうで、
5秒経つとこうなり、
そこから、さらに10秒経つとこうなる。
Task.Delayの場合は、
こう書くと、
最初はこう。
5秒後はこう。
その5秒後、つまりトータル10秒後にこうなる。
SimpleMethodの中だけで考えれば、"SimpleMethod Begin"から"SimpleMethod End"まで5秒待っている。
ただし、外側の"SimpleMethod After"は関係無いので、すぐ処理されてSleepのところでSimpleMethodが終わるのを待っている。
もし、外側も含めて止めたいなら、SimpleMethodもawaitしないといけないし、そうするとその関数もasyncにしないといけないという、awaitとasyncの伝搬が続いていってしまう。
Sample/dotnet/Task/Delay/src/Task_ at master · bg1bgst333/Sample · GitHub