C# の Timer 種類別 特徴 と 使い方

2 件のコメント

C#、.NET Framework で提供されている Timer は、System.Windows.Forms.TimerSystem.Threading.TimerSystem.Timers.Timer の3種類があります。 それぞれの特徴を調べたので、以下の表にまとめてみました。 また、その下ではそれぞれのタイマーの詳しい特徴と利用方法をまとめました。

で、いきなり結論ですが、汎用的には System.Timers.Timer を利用するのがよさそうです。 精度が高く、UI のあるなしに関わらず利用できる (=ASP.NET でも利用可能) といった点が メリット として大きいと思います。

  精度 同期/非同期 Windowsフォームでの利用
System.Windows.Forms.Timer 同期
System.Threading.Timer 非同期 ×
System.Timers.Timer 非同期

System.Windows.Forms.Timer

特徴

  • Windows Form 向けに最適化
  • 精度が低い(上限 55msec。Windows メッセージループ の影響を受ける)
  • 複数回分のイベントがまとめて1つとして発生する場合がある
  • メイン関数と同一スレッドで動作(=シーケンシャル動作)

サンプルコード

using System;
using System.Windows.Forms;

public class Program1 : Form
{
    public Program1()
    {
        this.InitializeComponent();
    }

    public void InitializeComponent()
    {
        // タイマー生成
        var timer = new Timer();
        timer.Tick += new EventHandler(this.OnTick_FormsTimer);
        timer.Interval = 1000;

        // タイマーを開始
        timer.Start();

        // タイマーを停止
        timer.Stop();
    }

    public void OnTick_FormsTimer(object sender, EventArgs e)
    {
    }
}

System.Threading.Timer

特徴

  • Windows Form での使用は非推奨
  • 軽量
  • 別スレッドで動作
  • インスタンス生成時のみデリゲートを設定できる
  • 実行中はどこかにインスタンス保持しておかないとガベッジ対象になる

サンプルコード

using System.Threading;

class Program2
{
    static void Main(string[] args)
    {
        // タイマーの生成
        var timer = new Timer(new TimerCallback(ThreadingTimerCallback));

        // タイマーをすぐに1秒間隔で開始
        timer.Change(0, 1000);

        // タイマーを停止
        timer.Change(Timeout.Infinite, Timeout.Infinite);
    }

    static void ThreadingTimerCallback(object args)
    {
    }
}

System.Timers.Timer

特徴

  • 精度が高い
  • 別スレッドで動作
  • 実行中はどこかにインスタンス保持しておかないとガベッジ対象になる

サンプルコード

using System.Timers;

class Program3
{
    static void Main(string[] args)
    {
        // タイマーの生成
        var timer = new Timer();
        timer.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer);
        timer.Interval = 1000;

        // タイマーを開始
        timer.Start();

        // タイマーを停止
        timer.Stop();
    }

    static void OnElapsed_TimersTimer(object sender, ElapsedEventArgs e)
    {
    }
}

参考記事

  1. 返信
    1. ありがとうござます。
      お役に立てて何よりです!

      削除