Thread.Sleep の使用方法
Thread.Sleepメソッドにスリープしたい時間をミリ秒で渡します。1秒 = 1000ミリ秒です。using System.Threading;
Thread.Sleep(停止する時間をミリ秒で指定);
using System;
using System.Threading;
Thread.Sleep(TimeSpan.FromSeconds(秒で指定));
Thread.Sleep(TimeSpan.FromMinutes(分で指定));
Task.Delay の使用方法
Task.Delayメソッドにスリープしたい時間(ミリ秒、1秒 = 1000ミリ秒)を渡すと、指定した時間後に完了するタスクを返します。停止するタイミングは、Task.Delay が返したタスクが実行された時です。using System.Threading.Tasks;
Task 指定時間で完了するタスク = Task.Delay(停止する時間をミリ秒で指定);
using System;
using System.Threading.Tasks;
Task 1秒で完了するタスク = Task.Delay(TimeSpan.FromSeconds(1));
Task 1分で完了するタスク = Task.Delay(TimeSpan.FromMinutes(1));
非同期関数 での使用例
// 非同期関数
async Task AsyncFunction()
{
// 非同期関数を4秒停止
await Task.Delay(4000);
}
// 非同期関数を実行
var task = AsyncFunction();
// ここで4秒停止
task.Wait();
Thread.Sleep と Task.Delay の違い
Thread.Sleep は、Thread.Sleep を実行したスレッドを中断します。Task.Delay は、指定時間後に完了するタスクを作成します。Thread.Sleep
- Thread.Sleep を実行したスレッドを指定時間中断します。
- 停止タイミングは、Thread.Sleep が実行された時です。
- メインスレッド でThread.Sleep を実行しても、サブスレッドは停止しません。
- サブスレッドで Thread.Sleep を実行しても、メインスレッドは停止しません。
Task.Delay
- 指定時間後に完了するタスクを作成します。
- 停止タイミングは、Task.Delay の返すタスクが実行された時です。
- 主に非同期関数・非同期メソッドで使用します。
- タスクを生成したスレッドが終了すると、Delay中でも中断されます。
Thread.Sleep のサンプルプログラム
次のサンプルコードは サブスレッドを4秒、メインスレッドを2秒 停止させるコンソール・アプリケーションです。- Thread.Sleepは他のスレッドをスリープさせないため、合計の6秒ではなく、4秒程度でプログラムは終了します。
- サブスレッドは4秒スリープするため、先にメインスレッドが完了します。
- アプリケーションはメインスレッド完了時ではなく、全てのスレッドが完了すると終了します。
using System.Threading;
class Program
{
private static System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
// メインメソッド
static void Main(string[] args)
{
// 実行時間の計測開始
stopWatch.Start();
System.Console.WriteLine($"メインスレッド 開始 {stopWatch.Elapsed}");
// サブスレッドを作成
Thread subThread = new Thread(SubThreadProc);
// サブスレッドの実行を開始
subThread.Start();
// メインスレッドを2秒停止
System.Console.WriteLine($"メインスレッド 2秒停止");
Thread.Sleep(2000);
System.Console.WriteLine($"メインスレッド 終了 {stopWatch.Elapsed}");
}
// サブスレッド
private static void SubThreadProc()
{
System.Console.WriteLine($" サブスレッド 開始 {stopWatch.Elapsed}");
// サブスレッドを4秒停止
System.Console.WriteLine($" サブスレッド 4秒停止");
Thread.Sleep(4000);
System.Console.WriteLine($" サブスレッド 終了 {stopWatch.Elapsed}");
}
}

Task.Delay のサンプルプログラム
次のサンプルコードは 非同期関数内で4秒 停止させるコンソール・アプリケーションです。using System.Threading.Tasks;
class Program
{
private static System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
// メインメソッド
static void Main(string[] args)
{
// 実行時間の計測開始
stopWatch.Start();
System.Console.WriteLine($"メインスレッド 開始 {stopWatch.Elapsed}");
// 非同期関数の実行
var task = AsyncFunction();
// タスクの完了を待つ
task.Wait();
System.Console.WriteLine($"メインスレッド 終了 {stopWatch.Elapsed}");
}
// 非同期関数
private static async Task AsyncFunction()
{
System.Console.WriteLine($" 非同期関数 開始 {stopWatch.Elapsed}");
// 非同期関数を4秒停止
System.Console.WriteLine($" 非同期関数 4秒停止");
await Task.Delay(4000);
System.Console.WriteLine($" 非同期関数 終了 {stopWatch.Elapsed}");
}
}

参考資料
検証環境
- .NET 5.0
- Microsoft Visual Studio Professional 2019 Version 16.11.16
- Microsoft Windows 10 Enterprise Version 22H2 OS Build 19045.2251 Experience: Windows Feature Experience Pack 120.2212.4180.0