[C#] 四種計時器類別的比較 (System.Threading/System.Timers/System.Windows.Forms/System.Windows.Threading)

針對 System.Threading/System.Timers/System.Windows.Forms/System.Windows.Threading 命名空間下四種計時器的比較

整理一下自己歸類好的幾個常用計時器 Timer
還是要看使用場景才能決定使用哪種計時器,建議不要在計時器執行負載過重吃效能的工作,這類功能應該放到執行緒(Thread/TPL)

Name SpaceSystem.ThreadingSystem.TimersSystem.Windows.FormsSystem.Windows.Threading
類別 ClassTimerTimerTimerDispatcherTimer
屬性 Properties1. ActiveCount1. AutoReset
2. Enabled
3. Interval
4. Site
5. SynchronizingObject
1. Enabled
2. Interval
3. Tag
1. Dispatcher
2. Interval
3. IsEnabled
4. Tag
方法 Methods1. Change
2. Dispose
3. DisposeAsync
1. BeginInit
2. Close
3. Dispose
4. EndInit
5. Start
6. Stop
1. Dispose
2. OnTick
3. Start
4. Stop
5. ToString
1. Start
2. Stop
事件 Events 1. Elapsed1. Tick1. Tick
適用版本(.Net Framework)1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.81.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.81.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.13.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
組件 Assemblymscorlib.dllSystem.dllSystem.Windows.Forms.dllWindowsBase.dll
可繼承性不可
是否與 UI 同一執行緒
用 delegate 或 Dispatcher
否 
用 SynchronizingObject 或 Dispatcher
是 
整合進 Dispatcher 佇列中
計時器解析度 Resolution 毫秒
15.6 ms 
OS時間精度,此處參考Win7/Win8
毫秒
15.6 ms 
OS時間精度,此處參考Win7/Win8
毫秒
55 ms 
毫秒
15.6 ms 
OS時間精度,此處參考Win7/Win8
使用方式回調委託(建構時指定,無法改變)訂閱 Elapsed 事件訂閱 Tick 事件訂閱 Tick 事件
執行時間>間隔時間1. 依循先觸發先完成,但會同時好幾個觸發任務在執行
2. 觸發間隔時間到即執行
3. 因觸發間隔太短會造成已觸發的多個執行緒無法同時停止
1. 依循先觸發先完成,但會同時好幾個觸發任務在執行
2. 基本觸發間隔時間到就執行,但ThreadPool執行緒數量達上限則會影響
3. 同時執行的觸發任務數量受執行緒池的數量限制
4. 當SynchronizingObject非null且有指定執行緒上觸發事件,執行效果與System.Windows.Forms相同(單執行緒)
1. 後觸發任務先執行待後任務執行完畢再執行前任務
2. 觸發間隔時間到即觸發新執行任務
3. 會有 UI 卡頓感
1. 每次觸發任務一定執行完畢才開始計算間隔時間
2. 間隔時間會因未完成觸發任務往後推遲
3. 會有 UI 卡頓感

使用上我常用『執行時間>間隔時間』來判斷要用哪一類計時器!

當觸發時會強制執行完才繼續下輪的計時器,執行起來容易感覺程式會偶發停頓一下!反之就容易重負載工作掉指令的事發生!