C# でフリーズさせずにスリープする最も簡単な方法は Task.Delay()

Visual Studio 2013 を使用。

C# sleep」などで検索すると、 System.Threading.Thread.Sleep()が出てくる。

そして、System.Threading.Thread.Sleep() を Windowsフォームアプリケーションで普通に書くと、 スリープの間、フリーズしてしまう。

これはGUIスレッドでスリープさせているため、 ユーザの操作を受け付けられないからである。

回避するためには別スレッドで非同期にスリープさせれば良いのだが、 スリープ後にGUIスレッド上のコントロールを操作する必要がある場合は 非常にややこしくなる。

しかし、Visual Studio 2012 以降は Taskやasync/awaitが導入され、非同期処理が非常に簡単に書けるようになった。

Task.Delay() を使うことで、 以下のように簡単にGUIスレッドをフリーズさせないスリープができる。

private async void sleepAsync()
{
    await Task.Delay(5 * 1000);
}

ミリ秒でスリープ時間を指定する。

await で待つ必要があるので、Task.Delay() を使う関数は async を付けておく。