Task.Delay

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秒経つとこうなり、
5秒経つとこうなり、

5秒経つとこうなり、

そこから、さらに10秒経つとこうなる。
そこから、さらに10秒経つとこうなる。

そこから、さらに10秒経つとこうなる。
Task.Delayの場合は、

こう書くと、

最初はこう
最初はこう

最初はこう。

5秒後はこう
5秒後はこう

5秒後はこう。

その5秒後、つまりトータル10秒後にこうなる。
その5秒後、つまりトータル10秒後にこうなる。

その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