C#のTimerの使い方:1回だけ実行から経過時間の計測まで

C#のTimerクラスは、プログラム内で指定した時間間隔で処理を実行するために非常に便利なツールです。
しかし、タイマーの設定や管理にはいくつかのポイントがあり、適切な使い方を理解することが重要です。

本記事では、C#のTimerを使いこなすために必要な基礎知識から、1回だけの実行、経過時間の計測までの具体例を紹介します。
この記事を読むことで、Timerの多様な活用方法が学べ、開発での効率が向上するでしょう。

記事のポイント

  • Timerクラスの基礎的な使い方と設定方法
  • Timerで1回だけの処理を実行する方法
  • 経過時間を計測するためのTimerの利用法
  • スレッドセーフなTimerの管理方法
  • 即時実行や特定の時間に基づく処理の活用法
目次

【C#】Timerの基本操作と使い方

Timerで1回だけ実行する方法

1回だけタイマーを動作させたい場合、System.Timers.TimerクラスのAutoResetプロパティをfalseに設定する方法が有効です。
これにより、タイマーは一度だけ動作して自動的に停止します。
以下のコード例では、タイマーが設定された時間後に1回だけメソッドが実行されます。

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        System.Timers.Timer timer = new System.Timers.Timer(3000); // 3秒後に実行
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = false;       // 1回だけ実行
        timer.Start();

        Console.WriteLine("タイマーを開始しました...");
        Console.ReadLine();
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("タイマーを開始しました...");
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("1回だけ実行されました。");
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("1回だけ実行されました。");
    }
}

Timerで経過時間を計測する方法

C#のTimerを使って経過時間を計測する場合、タイマー開始時点のDateTimeを記録し、その後、経過時間を比較して求めることができます。
このアプローチを使うことで、アプリケーションの動作時間や特定の処理の経過時間を正確に測定できます。

using System;
using System.Timers;

class Program
{
    static DateTime startTime;

    static void Main()
    {
        startTime = DateTime.Now;  // 計測開始時点
        System.Timers.Timer timer = new System.Timers.Timer(1000); // 毎秒実行
        timer.Elapsed += OnTimedEvent;
        timer.Start();

        Console.WriteLine("経過時間を計測中...");
        Console.ReadLine();
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("経過時間を計測中...");
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        TimeSpan elapsed = DateTime.Now - startTime;
        Console.WriteLine($"経過時間: {elapsed.TotalSeconds} 秒");
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine($"経過時間: {elapsed.TotalSeconds} 秒");
    }
}

【C#】Timerの応用的な使い方

Timerの終了待ちの実装方法

タイマーが終了するまで待機する必要がある場合、Taskを使って非同期に処理を進める方法があります。
この方法では、メインスレッドをブロックせずにタイマーが終了するのを待てます。

using System;
using System.Threading.Tasks;
using System.Timers;

class Program
{
    static async Task Main()
    {
        await WaitForTimerAsync(3000); // 3秒待機
        Console.WriteLine("タイマー終了待ちが完了しました。");
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("タイマー終了待ちが完了しました。");
    }

    static Task WaitForTimerAsync(int interval)
    {
        var tcs = new TaskCompletionSource<bool>();
        System.Timers.Timer timer = new System.Timers.Timer(interval);
        timer.Elapsed += (s, e) =>
        {
            timer.Stop();
            tcs.SetResult(true);
        };
        timer.Start();
        return tcs.Task;
    }
}

別スレッドでタイマーを管理する方法

C#のTimerを使用して、別スレッドでタイマーを動作させることが可能です。
このアプローチは、タイマー処理がメインスレッドをブロックするのを避けるために有用です。

using System;
using System.Threading;
using System.Timers;

class Program
{
    static void Main()
    {
        Thread timerThread = new Thread(() =>
        {
            System.Timers.Timer timer = new System.Timers.Timer(2000);
            timer.Elapsed += (s, e) => Console.WriteLine("別スレッドでタイマーが動作中です。");
            // Windows Formsの場合
            //timer.Elapsed += (s, e) => System.Diagnostics.Debug.WriteLine("別スレッドでタイマーが動作中です。");
            timer.Start();
            Thread.Sleep(10000); // タイマーが10秒間動作する
            timer.Stop();
        });

        timerThread.Start();
        Console.WriteLine("メインスレッドが他の処理を実行中です。");
        Console.ReadLine();
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("メインスレッドが他の処理を実行中です。");
    }
}

特定の時間に基づいて処理を実行する方法

Timerを使って特定の時間に実行する処理を実現するには、計算した残り時間でタイマーを設定する方法があります。
以下は、設定した時間に実行する例です。

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        DateTime targetTime = DateTime.Now.AddSeconds(10); // 10秒後に実行
        Timer timer = new Timer((targetTime - DateTime.Now).TotalMilliseconds);
        timer.Elapsed += (s, e) =>
        {
            Console.WriteLine("設定時間に達しました。処理を実行します。");
            // Windows Formsの場合
            //System.Diagnostics.Debug.WriteLine("設定時間に達しました。処理を実行します。");
            timer.Stop();
        };
        timer.Start();

        Console.WriteLine("特定の時間を待機しています...");
        Console.ReadLine();
        // Windows Formsの場合
        //System.Diagnostics.Debug.WriteLine("特定の時間を待機しています...");
    }
}

まとめ:C#のTimerの使い方を活用する

C#のTimerは、タイミングに基づいた処理を行う際に非常に有効なクラスであり、1回のみの実行や経過時間の計測、さらには別スレッドでの管理まで、多くの場面で活用できます。
適切に使用することで、プログラムのパフォーマンスと可読性が向上し、効率的なアプリケーションを構築できます。この記事で紹介した方法を参考にして、あなたのプロジェクトでTimerを最大限に活用してください。

参考サイト:Timer クラス

他にもC#の様々なテクニックの紹介やエンジニアに役立つ情報を発信していますので興味のある方は以下のリンクからどうぞ!

C#やエンジニアに役立つ情報はこちら

収入を上げたいエンジニアはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次