C#

C# コンソールアプリでタイマ処理

タイマの基本

タイマ処理は、「一定の周期(時間間隔)で処理を実行するもの」です。
この周期(時間間隔)は、実行したい処理によって決まるものですが、繰り返し同じ周期で行うものから、1回だけ呼び出されるもの(遅延処理)までいろいろあります。

 

コンソールアプリでもタイマ処理

Windows フォームアプリケーションには「タイマー処理」、「ポーリング処理」と言われる処理を実現するために
“System.Windows.Forms”名前空間にTimerクラスと呼ばれるクラスがあります。
こちらのクラスはデザイナでコントロールを配置してタイマイベント処理を書けば実現できるというクラスです。

ただ、”System.Windows.Forms”名前空間ですのでコンソールアプリケーションで使うには、”System.Windows.Forms”を参照に追加する必要があります。

コンソールアプリケーションで、”System.Windows.Forms”を参照に追加しなくても、System.Timers.Timerクラスを使ってタイマを使った処理を行うことができます。

System.Timers.Timerクラスのタイマを使ったサンプルプログラム

class Program
{
    static private long call_count;             // 呼び出された回数
    static private System.Timers.Timer timer1;  // タイマクラスオブジェクト

    static void Main(string[] args)
    {
        call_count = 0;
        timer1 = new System.Timers.Timer();

        timer1.Interval = 200.0;                // Intervalの設定単位はミリ秒
        timer1.Elapsed += Timer1_Elapsed;       // タイマイベント処理(時間経過後の処理)を登録
        timer1.Enabled = true;                  // <-- これを呼ばないとタイマは開始しません

        Console.WriteLine("Press any key!!");
        Console.ReadKey();
    }

    private static void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        // タイマイベントの処理
        Console.WriteLine(string.Format("Called Timer1_Elapsed. Count={0}", ++call_count));
    }
}

 

このプログラムは、起動すると200msec(ミリ秒)おきにTimer1_Elapsedというメソッド(イベントハンドラ)が呼びだされ、処理を行います。
タイマイベントの処理中で呼び出された回数をカウントアップして表示しています。

キーを押してプログラムを終了するまで200msec(ミリ秒)おきに何度でもタイマイベント処理を呼び続けます。

 

タイマイベントを1回だけ実行するとき

タイマイベントの処理を1回だけ実行する方法は、大きく2通りあります。

1つ目は、タイマイベントで「次は呼び出さない」ようにする方法です。

class Program
{
    static private long call_count;             // 呼び出された回数
    static private System.Timers.Timer timer1;  // タイマクラスオブジェクト

    static void Main(string[] args)
    {
        call_count = 0;
        timer1 = new System.Timers.Timer();

        timer1.Interval = 200.0;                // Intervalの設定単位はミリ秒
        timer1.Elapsed += Timer1_Elapsed;       // タイマイベント処理(時間経過後の処理)を登録
        timer1.Enabled = true;                  // <-- これを呼ばないとタイマは開始しません

        Console.WriteLine("Press any key!!");
        Console.ReadKey();
    }

    private static void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timer1.Enabled = false;                 // Enableプロパティをfalseにすると次からタイマイベントは発生しません
        // タイマイベントの処理
        Console.WriteLine(string.Format("Called Timer1_Elapsed. Count={0}", ++call_count));
    }
}

 

timer1.Enabeld = false;とすると、次からのタイマイベントが呼び出されなくなります。
タイマイベント以外の箇所でも、timer1.Enabeld = false;とするとタイマイベントを呼び出さなくなります。

timer1.Enabeld = false;とした後、timer1.Enabeld = true;とすると、trueにセットしたところから一定時間後(このプログラムの場合は200msec後)にまたタイマイベントが呼び出されます。

 

2つ目は、AutoResetプロパティを操作する方法です。

class Program
{
    static private long call_count;             // 呼び出された回数
    static private System.Timers.Timer timer1;  // タイマクラスオブジェクト

    static void Main(string[] args)
    {
        call_count = 0;
        timer1 = new System.Timers.Timer();

        timer1.AutoReset = false;               // 1回しか呼ばない場合はfalse
        timer1.Interval = 200.0;                // Intervalの設定単位はミリ秒
        timer1.Elapsed += Timer1_Elapsed;       // タイマイベント処理(時間経過後の処理)を登録
        timer1.Enabled = true;                  // <-- これを呼ばないとタイマは開始しません

        Console.WriteLine("Press any key!!");
        Console.ReadKey();
    }

    private static void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        // タイマイベントの処理
        Console.WriteLine(string.Format("Called Timer1_Elapsed. Count={0}", ++call_count));
    }
}

 

2つともTimer1_Elapsedを1回呼び出したら、2回目以降は呼び出されません。

 

タイマイベント(Elapsedイベント)の引数

(object sender, System.Timers.ElapsedEventArgs e)の2つで、1つ目’sender’は、System.Timers.Timerクラスオブジェクト(この例ではtimer1)です。
‘e’は、System.Timers.ElapsedEventArgsクラスオブジェクトで使用可能なメンバは1つです。
SignalTimeプロパティはこのタイマイベントが発生した日付/時刻が格納されています。

 

タイトルとURLをコピーしました