.NET TIPS

タイマにより一定時間間隔で処理を行うには?(サーバベース・タイマ編)

デジタルアドバンテージ 遠藤 孝信
2005/11/11

 .NET Frameworkには一定時間間隔で処理を行う(メソッドを呼び出す)ためのタイマ機能として、以下の3種類のTimerクラスが用意されている。

Windowsタイマ:System.Windows.Forms.Timerクラス (解説TIPSへ
スレッド・タイマ:System.Threading.Timeクラス (解説TIPSへ
サーバベース・タイマ:System.Timers.Timerクラス

 本稿ではのサーバベース・タイマについて、その基本的な使い方をまとめる。

サーバベース・タイマ:System.Timers.Timerクラス

 System.Timers名前空間のTimerクラスはサーバベース・タイマとも呼ばれ、Windowsアプリケーションだけでなくサーバサイド・アプリケーションでの利用も想定されており、より正確な時間間隔でメソッドを実行できる。

 このTimerクラスでは、ElapsedEventHandlerデリゲート(System.Timers名前空間)を使用して、タイマにより呼び出されるメソッド(以下、タイマ・メソッドと記す)のデリゲートを作成し、TimerクラスのElapsedイベント(elapseは「時が経過する」の意味)に登録する(VB.NETではWithEvents/Handles キーワードによりイベントを登録することも可能)。

 タイマ・メソッドの呼び出し間隔は、コンストラクタのパラメータかIntervalプロパティで指定できる(単位はミリ秒)。AutoResetプロパティでは、タイマ・メソッドを継続して呼び出すか(trueに設定。デフォルト値)、1度だけ呼び出すか(falseに設定)を指定する。また、タイマの開始/停止は、Enabledプロパティにtrue/falseを設定して行う(Start/Stopメソッドを呼び出してもよい)。

 以下にサーバベース・タイマを利用したサンプル・プログラムを示す。MyClockメソッドがタイマにより一定間隔で実行されるメソッドである。

// timerstimer.cs

using System;
using System.Timers;

public class TimersTimerTest {
  static void Main() {
    TimersTimerTest ttt = new TimersTimerTest();
    ttt.Run();
  }

  public void Run() {
    Timer timer = new Timer();
    timer.Elapsed += new ElapsedEventHandler(MyClock);
    timer.Interval  = 1000; // コンストラクタでも指定可
    timer.AutoReset = true; // デフォルト
    timer.Enabled   = true; // timer.Start()と同じ

    Console.ReadLine(); // キーが押されるまで待機
  }

  public void MyClock(object sender, ElapsedEventArgs e) {
    Console.WriteLine(DateTime.Now);
    // 出力例:
    // 2005/11/08 19:59:10
    // 2005/11/08 19:59:11
    // 2005/11/08 19:59:12
    // ……
  }
}

// コンパイル方法:csc timerstimer.cs
サーバベース・タイマを使用したC#のサンプル・プログラム(timerstimer.cs )
 
' timerstimer.vb

Imports System
Imports System.Timers

Public Class TimersTimerTest
  Shared Sub Main()
    Dim ttt As TimersTimerTest = New TimersTimerTest()
    ttt.Run()
  End Sub

  Public Sub Run()
    Dim timer As Timer = New Timer()
    AddHandler timer.Elapsed, _
      New ElapsedEventHandler(AddressOf MyClock)
    timer.Interval = 1000 ' コンストラクタでも指定可
    timer.AutoReset = true ' デフォルト
    timer.Enabled  = true ' timer.Start()と同じ

    Console.ReadLine() ' キーが押されるまで待機
  End Sub

  Public Sub MyClock(sender As Object, e As ElapsedEventArgs)
    Console.WriteLine(DateTime.Now)
    ' 出力例:
    ' 2005/11/08 19:59:10
    ' 2005/11/08 19:59:11
    ' 2005/11/08 19:59:12
    ' ……
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll timerstimer.vb
サーバベース・タイマを使用したVB.NETのサンプル・プログラム(timerstimer.vb)

 Visual Studioでプログラミングしている場合には、ツールボックスの[コンポーネント]タブから「Timerコンポーネント」をフォームにドラッグ&ドロップするだけで利用可能な状態となる。配置したTimerコンポーネントをダブルクリックすれば、タイマ・メソッド(Elapsedイベント・ハンドラ)が自動的に作成される。

 TimerコンポーネントはWindowsフォーム用のTimerコンポーネントと異なり、Webフォームなどでも利用可能だ。ちなみにこのタイマは、Windows OSの「待機可能タイマ」と呼ばれるタイマをベースにしている(Win32 APIではCreateWaitableTimer関数により待機可能タイマを作成できる)。

Windowsフォームでの利用について

 このタイマでは、スレッド・タイマ(System.Threading.Timeクラス)と同様に、.NET Frameworkが管理するスレッドプールによりタイマ・メソッドが実行されるため、タイマ・メソッドはTimerクラスをインスタンス化したスレッドとは異なるスレッドで実行される。このため、これをWindowsフォームで利用する場合にはコントロールの操作に関して注意が必要となる(これについては「TIPS:Windowsフォームで別スレッドからコントロールを操作するには?を参照」)。

 しかしサーバベース・タイマにはSynchronizingObjectプロパティが用意されており、このプロパティにフォームのインスタンスを設定することにより、タイマ・メソッドがUIスレッドで実行されるようになる。

 ただしこの場合には、もしUIスレッドで時間のかかる処理を行っていると、タイマ・メソッドの呼び出しが待たされることになる(SynchronizingObjectプロパティを利用した場合の挙動については「TIPS:Windowsアプリケーションでファイルやディレクトリを監視するには?」の後半部分が参考になる)。

 なお、Visual Studio .NETでTimerコンポーネントをWindowsフォームに配置した場合には、自動的にWindowsフォームのインスタンスがSynchronizingObjectプロパティに設定される。

.NET Framework 1.1/1.0におけるサーバベース・タイマのバグ情報

 System.Timers.Timerクラスについては現在、以下のバグがMicrosoftより報告されている。

 これはSystem.Timers.Timer クラスのElapsedイベントが、Windowsサービス上では起動しないことがあるというバグである。不可解な挙動が起こる場合には、この情報をチェックしていただきたい。なお2005年11月11日時点で、これらの問題を修正するHotFixやService Packは提供されていない。End of Article

カテゴリ:クラス・ライブラリ 処理対象:タイマ
使用ライブラリ:Timerクラス(System.Timers名前空間)
使用ライブラリ:ElapsedEventHandlerデリゲート(System.Timers名前空間)
関連TIPS:タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
関連TIPS:
タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
関連TIPS:
Windowsフォームで別スレッドからコントロールを操作するには?
関連TIPS:
Windowsアプリケーションでファイルやディレクトリを監視するには?

この記事と関連性の高い別の.NET TIPS
タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
Windowsフォームで別スレッドからコントロールを操作するには?
[Silverlight 2]タイマを利用するには?
時間のかかる処理をバックグラウンドで実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ


- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

目立つ! 読まれる! ブログを作る4つのポイント
ブランドの認知度向上に向けて、ブログを活用している企業は多い。だが実際、あまたのブ...

VOYAGE GROUP、東京工業大学と産学連携 ―― アドテクノロジー分野のビッグデータ活用を共同研究
VOYAGE GROUPは4月17日、東京工業大学と産学連携し、アドテクノロジー分野におけるビッグ...

日本のメディアが進む道 ―― 朝日新聞メディアラボ、東洋経済オンライン、NHKのメディア戦略から読み解く
メディアは生き残れるのかといった議論が活発な昨今。テレビや新聞、雑誌などのマスメデ...