C# 三種定時器 (Timer) 的使用情境

August 26, 2018

C# 提供了數種 Timer,分別適用於不同的使用情境。本文將介紹 System.Windows.Forms.Timer、System.Timers.Timer 和 System.Threading.Timer 的簡介、使用方法,最後並整理它們的差異。

System.Windows.Form.Timer

通常用於 Windows Forms 應用程式中,用來定期更新 UI 元件,例如顯示計時器或即時資料。

  1. 建立 Timer 物件。
  2. 設定 Timer 的間隔時間(以毫秒為單位)。
  3. 綁定事件處理函數(EventHandler),指向要更新元件的程式碼。
  4. 啟動 Timer。

範例

using System;
using System.Windows.Forms;

public class TimerExample
{
    private System.Windows.Forms.Timer myTimer;
    public Label myLabel {get; set;} // 給外部 Form 存取

    public TimerExample()
    {
        myLabel = new Label();
        
        myTimer = new System.Windows.Forms.Timer();
        myTimer.Interval = 1000; // 設置間隔為 1 秒
        myTimer.Tick += new EventHandler(UpdateLabel);
        myTimer.Start();
    }

    private void UpdateLabel(object sender, EventArgs e)
    {
        myLabel.Text = DateTime.Now.ToString("HH:mm:ss");
    }
}

註記

System.Timer.Timer

可以同時執行多個 Timer,適用需要多個定時發送事件的狀況。當應用程式需要高精度的計時功能或在多執行緒環境中運行時,可以考慮使用 System.Timers.Timer,會比 System.Windows.Form.Timer 更加適合。

  1. 建立 Timer 物件。
  2. 設定 Timer 的間隔時間。
  3. 綁定事件處理函數(ElapsedEventHandler)。
  4. 啟動 Timer。

範例

using System;
using System.Timers;

public class TimerExample
{
    private static System.Timers.Timer myTimer;

    public static void Main()
    {
        myTimer = new System.Timers.Timer(1000); // 設置間隔為 1 秒
        myTimer.Elapsed += OnTimedEvent;
        myTimer.AutoReset = true;
        myTimer.Enabled = true;

        Console.WriteLine("Press [Enter] to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
    }
}

註記

System.Threading.Timer

提供了一種基於執行緒集區 (Threading Pool) 的定時器機制,適合在多執行緒環境中執行計時任務。當需要在背景執行緒中執行計時任務,且不需與 UI 交互時,可以使用 System.Threading.Timer。

  1. 建立 Timer 物件,並設定 Callback 函數和狀態。
  2. 設定 Timer 的間隔時間。

範例

using System;
using System.Threading;

public class TimerExample
{
    private static System.Threading.Timer myTimer;

    public static void Main()
    {
        myTimer = new System.Threading.Timer(Callback, null, 0, 1000); // 設置 Callback 函數,初始延遲和間隔為 1 秒

        Console.WriteLine("Press [Enter] to exit the program.");
        Console.ReadLine();
    }

    private static void Callback(Object state)
    {
        Console.WriteLine("Timer callback executed at {0:HH:mm:ss.fff}", DateTime.Now);
    }
}

總結

用下表列出 Timer 的比較與選擇:

Timer 類型 優點 缺點 使用情境
System.Windows.Forms.Timer 簡單易用,專為 UI 更新設計 只能在 UI 執行緒中使用,精度較低 需要定期更新 Windows Forms UI 元件
System.Timers.Timer 高精度,可在多執行緒中運行,適合服務應用程式 使用稍微複雜,需要處理跨執行緒問題 需要高精度計時或多 Timer 的情況
System.Threading.Timer 基於執行緒集區,使用上較為簡單 沒有內建的 UI 更新機制 背景執行緒的計時任務,不需要與 UI 互動

作者學疏才淺,請參考 受控執行緒集區 - .NET - Microsoft LearnTimer 類別 (System.Threading) - Microsoft Learn 瞭解更詳細的知識。