今回は、C#のSleepメソッドで処理を一定時間停止する方法をご紹介します.
Sleepメソッドとは
通常、C#のプログラムを実行中に一時的な待機が必要な場面があります.
このようなときにThread.Sleepメソッドを使うと、指定した時間だけスレッドの実行を停止できます.
Thread.Sleepは、System.Threading名前空間に属する静的メソッドです.
ミリ秒単位の整数値を引数に取るほか、TimeSpanを用いて秒や分などをより直感的に指定することも可能です.
基本的な使い方とコード例
最もシンプルな使い方は、Thread.Sleep(ミリ秒)のようにミリ秒単位で指定する方法です.
以下のコードでは、3秒間処理を停止します.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; using System.Threading; class Program { static void Main() { Console.WriteLine("処理開始"); // 3000ミリ秒(3秒)待機する Thread.Sleep(3000); Console.WriteLine("3秒経過"); } } |
処理開始
3秒経過
コード内では、”処理開始” と表示された後、Thread.Sleep(3000)により3秒待機し、その後に”3秒経過”と表示されます.
TimeSpanを利用した指定方法
Thread.Sleepには、TimeSpanを用いて待機時間を指定するオーバーロードも存在します.
秒や分などを使ってより可読性の高いコードを書く場合に便利です.
以下のコード例では5秒間待機します.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; using System.Threading; class Program { static void Main() { Console.WriteLine("処理開始"); // TimeSpan.FromSeconds(5) により5秒待機 Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine("5秒経過"); } } |
処理開始
5秒経過
この方法を使うと、Thread.Sleep(TimeSpan.FromSeconds(5))のように、秒単位でわかりやすく時間を指定できます.
同期処理と非同期処理の違い
Thread.Sleepは呼び出したスレッドをブロックするため、UIスレッドなどで使用すると画面更新が止まり、フリーズしたように見えることがあります.
こうした場合には、Task.Delayなどの非同期手法を用いて待機する方法が推奨されます.
下記のコードでは、非同期メソッドTask.Delayで5秒待機しています.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; using System.Threading.Tasks; class Program { static async Task Main() { Console.WriteLine("処理開始"); // 非同期に5秒待機する(他の処理をブロックしにくい) await Task.Delay(5000); Console.WriteLine("5秒経過"); } } |
処理開始
5秒経過
この非同期アプローチでは、待機中も他のタスクが実行できるため、アプリケーション全体が応答なしになるリスクが低減します.
Sleepメソッド使用時の注意点
以下のポイントを意識して利用すると、予期せぬ動作を回避できます.
- UIスレッドのブロック: GUIアプリケーションの場合は画面更新が止まるため、できる限りTask.Delayなどの非同期手法を検討してください.
- 待機時間の精度: OSのスケジューラの影響により、指定時間より長くなるケースがあります.
- マルチスレッド環境: ブロッキングが他のスレッドに影響しないか、アーキテクチャ全体を考慮してください.
- デバッグ時の影響: Thread.Sleepによって処理が止まると、デバッグ作業のタイミングに影響する場合があります.
まとめ
Thread.Sleepはシンプルな待機処理を実装する際に非常に便利です.
ただし、UIアプリケーションなど応答性が重要な場面では、Task.Delayなどの非同期手法を活用すると効率的です.
用途やシーンに合わせて、ブロッキングと非ブロッキングを使い分けることが快適な開発につながります.