[C#] タイマーを使って指定時間ごとに処理を行う方法

[C#] タイマーを使って指定時間ごとに処理を行う方法

C# のタイマーで指定時間間隔で処理を行う

Timer を使うことで指定時間間隔で任意の処理を行うことができます。

Timerの種類

C#には複数のタイマーがあります。Threading.TimerTimers.Timer です。

他にも GUI用のタイマーとして、Forms.TimerDispatcherTimer というものもあります。それぞれ WindowsFrom と WPF のフレームワークで使うタイマーです。ここではそれぞれのフレームワークを使用する場合のみ使えます。

ここでは Threading.TimerTimers.Timer の使い方を見ていきます。

Threading.Timer

Threading.Timer は、一定時間感覚での処理を実行する機能を提供しています。スレッドプールから取得したワーカースレッドでタイマーの処理が実行されます。

TimerCallback デリゲートで実行する処理を指定します。タイマーの生成時に引数で実行間隔と開始までの時間、実行する処理を指定します。

インスタンス生成後、指定秒後に処理が開始されます。開始処理を呼び出すのではなく、生成時に起動します。

uusing System;
using System.Threading;

public class Program
{
    private static Timer MyTimer;
    public static void Main(string[] args)
    {
        var n = 0;
        // 指定秒数間隔で呼び出される処理
        TimerCallback callback = state =>
        {
            Console.WriteLine($"{n++}回目");

            // タイマー停止
            if (n == 10)
            {
                MyTimer.Dispose();
            }
        };

        // タイマー起動(0.5秒後に処理実行、1秒おきに繰り返し)
        MyTimer = new Timer(callback, null, 500, 1000);

        // タイマーの間隔変更
        //timer.Change(0, 100); // 0.1秒間隔に変更

        Console.ReadKey();
    }
}

コンストラクタの第2引数はコールバック関数に渡される引数です。

タイマーを停止するにはオブジェクトを破棄すればよいです。

タイマーが生きた状態で処理間隔を変更することも可能です。Change メソッドで開始までの時間と処理間隔の時間を変更できます。もうすでに起動しているのに変更してどういう意味があるのかはわかりませんが。

任意の繰り返し回数で処理を終えるには、Timerオブジェクトをコールバック関数の中からサワれるようにしておけば良いです。あとは呼び出し回数を数えてオブジェクトを破棄すれば終了します。

Timers.Timer

System.Timers.Timer クラスは、一定時間後に Elapsed イベントを発生させるタイマーです。

ミリ秒でイベント発生間隔を指定し、Start メソッドでタイマー開始、Stop メソッドでタイマーを停止させられます。

using System;
using System.Timers;

public class Program
{
    public static void Main(string[] args)
    {
        // 1秒(1000ミリ秒)間隔のタイマー
        var timer = new Timer(1000);

        // 実行される処理
        var n = 0;
        timer.Elapsed += (sender, e) =>
        {
            // senderはタイマーオブジェクトが入っている
            // var _timer = sender as Timer;

            // e は ElapsedEventArgs
            // イベント発生時刻を取得できる

            Console.WriteLine($"{n++}回目, {e.SignalTime}");

            if (n == 10)
            {
                // タイマーを止める
                timer.Stop();
            }
        };

        // タイマーの起動
        timer.Start();

        Console.ReadKey();
    }
}

イベントの引数でタイマーオブジェクトそのものが渡されるので、これを使えば停止させたりするのに、イベントの中から見える位置にタイマーを置かなくていいので便利です。

Threading.Timer と Timers.Timer の違い

タイマーの精度的にはどちらも変わりないので、使いやす方を使うといいです。

個人的には、Timers.Timer クラスのほうがいろいろと用意されていて使いやすいです。

以上。

C#カテゴリの最新記事