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

- システム
エンジニア - C#のTimerクラスはどのような働きをするのですか。
- プロジェクト
マネージャー - 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の方が軽量で精度も高くなっています。
- システム
エンジニア - 二つのTimerクラスの違いもよく分かりました。
- プロジェクト
マネージャー - それぞれの違いをよく理解して、アプリ開発に活用してください。
C#のTimerを使いこなそう
C#のTimerを解説しましたが、ご理解頂けましたでしょうか。ゲームやアニメーションなどの動きがあるリアルタイム処理にはタイマー処理は欠かせません。是非活用して、素晴らしいアプリケーションを作って下さい。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅)遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅)病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅)開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅)債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)