針對 System.Threading/System.Timers/System.Windows.Forms/System.Windows.Threading 命名空間下四種計時器的比較
整理一下自己歸類好的幾個常用計時器 Timer
還是要看使用場景才能決定使用哪種計時器,建議不要在計時器執行負載過重吃效能的工作,這類功能應該放到執行緒(Thread/TPL)
Name Space | System.Threading | System.Timers | System.Windows.Forms | System.Windows.Threading |
類別 Class | Timer | Timer | Timer | DispatcherTimer |
屬性 Properties | 1. ActiveCount | 1. AutoReset 2. Enabled 3. Interval 4. Site 5. SynchronizingObject | 1. Enabled 2. Interval 3. Tag | 1. Dispatcher 2. Interval 3. IsEnabled 4. Tag |
方法 Methods | 1. 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. Elapsed | 1. Tick | 1. 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.8 | 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.8 | 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.8, 4.8.1 | 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.1 |
組件 Assembly | mscorlib.dll | System.dll | System.Windows.Forms.dll | WindowsBase.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 卡頓感 |
使用上我常用『執行時間>間隔時間』來判斷要用哪一類計時器!
當觸發時會強制執行完才繼續下輪的計時器,執行起來容易感覺程式會偶發停頓一下!反之就容易重負載工作掉指令的事發生!