.NET 三大 Timer 比較表
| 特性 | System.Windows.Forms.Timer | System.Timers.Timer | System.Threading.Timer |
| 命名空間 | System.Windows.Forms | System.Timers | System.Threading |
| 底層機制 | Windows 訊息迴圈 | ThreadPool | ThreadPool |
| 精確度 | 低(~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 更輕量,適合大量計時器場景。
常見陷阱
- 重入問題:
Elapsed 事件執行時間超過間隔,可能並行觸發。解決:lock 或設 AutoReset=false 手動重啟。
- 記憶體洩漏:未
Dispose 導致計時器持續佔用 ThreadPool。
- UI 執行緒存取:非
Forms.Timer 的事件處理常式中操作控制項,必須用 Control.Invoke 或 SynchronizationContext。