首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 三種 Timer 類別完整比較與使用指南

     編輯:關於C語言

.NET 三大 Timer 比較表

特性System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer
命名空間System.Windows.FormsSystem.TimersSystem.Threading
底層機制Windows 訊息迴圈ThreadPoolThreadPool
精確度低(~55ms)高高
適用專案類型WinForms所有(含 WinForms/Console/Service)所有(輕量,無 UI 親和性)
拖放設計器支援是否否
事件模式Tick (UI 執行緒)Elapsed (ThreadPool 執行緒)Callback (ThreadPool 執行緒)
跨執行緒存取 UI安全需 Invoke需 Invoke

System.Timers.Timer 使用範例(推薦通用)


var timer = new System.Timers.Timer(10000); // 10 秒間隔
timer.Elapsed += (sender, e) => 
{
    // 注意:此處執行於 ThreadPool 執行緒,若操作 UI 需 Invoke
    Console.WriteLine("時間到: " + e.SignalTime);
};
timer.AutoReset = true;  // true=週期性,false=單次
timer.Enabled = true;    // 啟動

// 應用程式結束前
timer.Dispose(); // 釋放資源

System.Threading.Timer 精簡版


var timer = new Timer(
    callback: state => Console.WriteLine("Callback at " + DateTime.Now),
    state: null,
    dueTime: TimeSpan.Zero,
    period: TimeSpan.FromSeconds(10)
);
// 停止
timer.Change(Timeout.Infinite, Timeout.Infinite);
timer.Dispose();

選擇建議

  • WinForms 簡單 UI 定時:Forms.Timer(自動在 UI 執行緒觸發,無需 Invoke)。
  • 服務、主控台、高精度、背景工作:Timers.Timer 或 Threading.Timer。
  • Timers.Timer 提供 AutoReset、Enabled 等屬性較直覺;Threading.Timer 更輕量,適合大量計時器場景。

常見陷阱

  1. 重入問題:Elapsed 事件執行時間超過間隔,可能並行觸發。解決:lock 或設 AutoReset=false 手動重啟。
  2. 記憶體洩漏:未 Dispose 導致計時器持續佔用 ThreadPool。
  3. UI 執行緒存取:非 Forms.Timer 的事件處理常式中操作控制項,必須用 Control.Invoke 或 SynchronizationContext。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved