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を解説しましたが、ご理解頂けましたでしょうか。ゲームやアニメーションなどの動きがあるリアルタイム処理にはタイマー処理は欠かせません。是非活用して、素晴らしいアプリケーションを作って下さい。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)