C#のTimerの使い方とは?インスタンスの生成方法や2つのクラスの違いについて紹介!

- SE
- C#のTimerクラスはどのような働きをするのですか。
- PM
- Timerクラスはリアルタイム処理を行う場合に欠かせない機能です。インスタンスの生成方法や2つのクラスの違いについてご紹介しましょう。
この記事でわかること
C#のTimerとは?
C#のTimerクラスはタイマー処理に使用します。タイマー処理とは一定時間毎に処理を行うことです。例えばリアルタイムで動作するゲームやアニメーションを作る時などに、Timerクラスが役立ちます。
では早速Timerクラスを使ってみましょう。以下のC#サンプルを実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Timers; class Program { private static Timer timer; public static void Main() { timer = new Timer(3000); timer.Elapsed += timerEvent; timer.AutoReset = true; timer.Enabled = true; Console.WriteLine("Enterキーで終了します。"); Console.ReadLine(); timer.Stop(); timer.Dispose(); } private static void timerEvent(Object source, ElapsedEventArgs e) { Console.WriteLine("タイマーイベント発生 {0:HH:mm:ss}",e.SignalTime); } } |
Timerクラスのインスタンスを生成する
上のタイマー処理のC#サンプルについて解説しましょう。まず最初に、Timerクラス型の変数のtimerを宣言します。timerをstaticによって静的フィールドとするのは、タイマー処理を行う上で、Timerのインスタンスを常に同一のものにする必要があるからです。
次に「new Timer(3000)」でtimerのインスタンスを生成します。3000とは3000ミリ秒、つまり3秒という意味です。3秒毎にタイマーイベントを発生させます。
Timerクラスのプロパティを設定する
次に「timer.Elapsed += timerEvent;」でElapsedプロパティにtimerEventメソッドを登録します。このメソッドが3秒毎に呼ばれます。timer.AutoResetをtrueにするのは繰り返し発生させるためです。このプロパティをfalseにした場合は一度しか発生しません。
次にtimer.Enabledをtrueにしていますが、これでタイマーがスタートします。
タイマー処理の内容
タイマー処理中は「Console.ReadLine()」で入力待ちをしています。Enterの入力があればStopとDisposeでタイマーを終了します。
次のtimerEventメソッドは3秒毎に実行されるタイマーイベント処理です。この中ではパラメータとして渡されるElapsedEventArgsの時間情報を表示しています。
このC#サンプルを実行すると、以下のようになります。3秒毎に現在時刻が表示されます。
Enterキーで終了します。
タイマーイベント発生 16:46:24
タイマーイベント発生 16:46:27
タイマーイベント発生 16:46:30
Intervalプロパティで間隔を変更可能
Intervalプロパティでタイマー動作中も時間の間隔を変更することができます。イベント処理をするメソッドの最初のパラメータはTimerのインスタンスが渡されるので、以下のように変更することが可能です。
1 2 3 4 5 6 |
private static void timerEvent(Object source, ElapsedEventArgs e) { Console.WriteLine("タイマーイベント発生 {0:HH:mm:ss}", e.SignalTime); ((Timer)source).Interval += 1000; } |
実行すると以下のように1秒ずつ間隔が増えて行きます。
Enterキーで終了します。
タイマーイベント発生 19:39:24
タイマーイベント発生 19:39:28
タイマーイベント発生 19:39:33
タイマーイベント発生 19:39:39
タイマーイベント発生 19:39:46
ラムダ式も使用できる
Elapsedのメソッド登録は以下のようにC#のラムダ式を使うこともできます。こうすればtimerEventメソッドは不要になります。ラムダ式を使うと記述がスマートになるので積極的に活用しましょう。
1 2 3 4 5 |
timer.Elapsed += (source, e) => { Console.WriteLine("タイマーイベント発生 {0:HH:mm:ss}", e.SignalTime); }; |
System.Threading.Timerクラスについて
ここまでSystem.Timers.Timerクラスについて説明してきましたが、C#は他にSystem.Threading.Timerというクラスもあります。以下は上のSystem.Timers.Timerを使うC#サンプルと同じ動作をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Threading; class Program { public static void Main() { TimerCallback timer_delegate = new TimerCallback(timerEvent); // 2番目のパラメータはコールバックにObject型で渡される。とりあえずnull Timer timer = new Timer(timer_delegate, null, 3000, 3000); Console.WriteLine("Enterキーで終了します。"); Console.ReadLine(); timer.Dispose(); } private static void timerEvent(Object o) { Console.WriteLine("タイマーイベント発生 {0:HH:mm:ss}", DateTime.Now); } } |
ラムダ式を使用できる
「new Timer(timer_delegate, null, 3000, 3000);」で3000ミリ秒を2回指定しますが、最初の3000は最初のタイマーイベントが発生するまでの時間、次の3000はそれ以降のイベント発生の間隔となります。
なおTimerCallbackでメソッドを登録する箇所は、以下のようにC#のラムダ式を使うこともできます。System.Timers.TimerのElapsedと同じです。
1 2 3 4 5 |
TimerCallback timer_delegate = state => { Console.WriteLine("タイマーイベント発生 {0:HH:mm:ss}", DateTime.Now); }; |
System.Timers.TimerとSystem.Threading.Timerの違い
なおSystem.Threading.Timerの時間間隔の変更は、以下のC#サンプルのようにChangeメソッドを使用します。
1 2 3 |
Timer timer = new Timer(timer_delegate, timer_delegate, 3000, 3000); timer.Change(5000, 5000); |
System.Timers.TimerとSystem.Threading.Timerの違いは、System.Timers.Timerはサーバーベースで、System.Threading.Timerはスレッドプールとして使用する違いがあります。具体的には、System.Threading.Timerの方が軽量で精度も高くなっています。
- SE
- 二つのTimerクラスの違いもよく分かりました。
- PM
- それぞれの違いをよく理解して、アプリ開発に活用してください。
C#のTimerを使いこなそう
C#のTimerを解説しましたが、ご理解頂けましたでしょうか。ゲームやアニメーションなどの動きがあるリアルタイム処理にはタイマー処理は欠かせません。是非活用して、素晴らしいアプリケーションを作って下さい。