【C#.NET】裁きの守護神Timerクラスの基本と活用法を司法の神が厳格に解説

2024年11月15日金曜日

スレッド

t f B! P L

名前空間 System.Timers

Timer

自己紹介

私は司法の神であり、秩序と時間の管理には誰よりも厳格な者です。今回は「C#.NET」の「Timer」クラスについて、私の視点からその機能と使い方を詳しく解説いたしましょう。このクラスは、一定時間ごとに処理を実行したい場合に極めて有用です。では、その本質に迫ってまいりましょう。

基本機能

Timerクラスは、一定間隔でイベントを発生させるために使用されます。以下は、Timerクラスの基本的な使用例です。

C#

using System;
using System.Timers;

class Program
{
    private static Timer _timer;

    static void Main()
    {
        // Timerの設定 (インターバルは1000ミリ秒)
        _timer = new Timer(1000);
        _timer.Elapsed += OnTimedEvent;
        _timer.AutoReset = true; // 繰り返し実行
        _timer.Enabled = true;

        Console.WriteLine("Timerが動作しています。Enterキーを押して終了してください。");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("現在の時刻: {0:HH:mm:ss}", e.SignalTime);
    }
}

この例では、1秒ごとに現在時刻を表示するイベントが発生します。Timerクラスの主な役割は、このように定期的に処理を実行することです。

使う場面の注意点

Timerクラスは非常に便利ですが、適切に使用しないとリソースの無駄遣いや予期しない動作が発生する可能性があります。以下は注意点を示した例です。

C#

using System;
using System.Timers;

class Program
{
    private static Timer _timer;

    static void Main()
    {
        // 過度に短いインターバルを設定
        _timer = new Timer(10); // 10ミリ秒ごと
        _timer.Elapsed += OnTimedEvent;
        _timer.AutoReset = true;
        _timer.Enabled = true;

        Console.WriteLine("過度に短いインターバルのTimerが動作中。Enterキーで終了。");
        Console.ReadLine();

        // Timerを終了
        _timer.Stop();
        _timer.Dispose();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        // 短すぎる間隔では処理が詰まる可能性
        Console.WriteLine("タイマーイベント発生: {0}", e.SignalTime);
    }
}

インターバルを短く設定しすぎると、CPU負荷が高くなる可能性があります。必要に応じた適切な間隔を設定しましょう。

プロパティの詳細な使い方

Timerクラスには、便利なプロパティがいくつかあります。それぞれの特徴と使用方法を見ていきましょう。

1. Interval プロパティ

このプロパティは、Timerイベントの発生間隔(ミリ秒単位)を設定します。

C#

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        Timer timer = new Timer();
        timer.Interval = 2000; // 2秒ごとにイベント発生
        timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("2秒経過しました: {0}", e.SignalTime);
        };
        timer.Start();

        Console.WriteLine("Timerが動作しています。Enterキーで終了してください。");
        Console.ReadLine();
        timer.Stop();
        timer.Dispose();
    }
}

**注意点:** `Interval`が0または負の値を設定された場合、例外がスローされます。

2. Enabled プロパティ

Timerの動作状態(有効または無効)を示すプロパティです。`true`で動作を開始し、`false`で停止します。

C#

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        Timer timer = new Timer(1000); // 1秒ごとにイベント発生
        timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("1秒経過しました: {0}", e.SignalTime);
        };

        // Timerの有効化
        timer.Enabled = true;
        Console.WriteLine("Timerが有効化されました。Enterキーで停止してください。");

        Console.ReadLine();
        timer.Enabled = false; // Timerの無効化
        Console.WriteLine("Timerが無効化されました。");
    }
}

3. AutoReset プロパティ

イベントを一度だけ実行するか、繰り返すかを設定します。`true`の場合は繰り返し実行され、`false`の場合は一度だけ実行されます。

C#

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        Timer timer = new Timer(3000); // 3秒後に1度だけイベント発生
        timer.AutoReset = false;
        timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("3秒後に1度だけイベントが発生しました: {0}", e.SignalTime);
        };
        timer.Start();

        Console.WriteLine("Timerが動作中です。Enterキーで終了してください。");
        Console.ReadLine();
        timer.Dispose();
    }
}

繰り返し処理が不要な場合は、`AutoReset = false`を使用することでリソースを節約できます。

以上のプロパティを活用することで、Timerクラスをより柔軟かつ効率的に使用できます。それぞれの設定を目的に応じて組み合わせることで、様々なシナリオに対応可能です。

具体的な使い方

Timerクラスのプロパティを活用した詳細なサンプルコード**を追加します。このコードでは、`Interval`、`Enabled`、および`AutoReset`を組み合わせて、タイマーを制御する実践的な例を示します。

C#

using System;
using System.Timers;

class Program
{
    private static Timer timer;
    private static int eventCount = 0; // イベントの発生回数を記録

    static void Main()
    {
        // Timerの初期化
        timer = new Timer
        {
            Interval = 2000,     // 2秒ごとにイベントを発生
            AutoReset = true,    // 繰り返し実行
            Enabled = true       // 初期状態で有効化
        };

        // イベントハンドラの登録
        timer.Elapsed += OnTimedEvent;

        Console.WriteLine("Timerが動作を開始しました。");
        Console.WriteLine("10回イベントが発生したら終了します。");

        // イベント終了まで待機
        while (eventCount < 10) { } 

        // Timerの停止とリソース解放
        timer.Stop();
        timer.Dispose();

        Console.WriteLine("Timerが停止しました。");
        Console.WriteLine("プログラムを終了します。");
    }

    // Timerイベントの処理
    private static void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        eventCount++;
        Console.WriteLine("イベントが発生しました ({0}回目): {1}", eventCount, e.SignalTime);

        // 10回目のイベントでタイマーを停止
        if (eventCount >= 10)
        {
            Console.WriteLine("最大回数に達しました。");
            timer.Enabled = false; // Timerを無効化
        }
    }
}
1.Timerの設定
    `Interval`プロパティで、イベントの発生間隔を2秒に設定しています。
    `AutoReset = true`を設定して、イベントを繰り返し実行するようにしています。
    `Enabled = true`で初期状態からタイマーを動作させています。
2.イベントの処理
    `OnTimedEvent`メソッドは、Timerがトリガーするたびに呼び出されます。
    イベント発生回数をカウントし、10回目でタイマーを停止します。

この詳細なサンプルコードは、タイマーの基本機能を活用しつつ、停止条件や動的なイベント処理を含む実践的なシナリオを示しています。

このブログを検索

QooQ