簡介:定時器一般用作「固定時間間隔」執行某個「任務」。
兩種情況:
「固定時間間隔」執行某個「不耗時」任務
? ? 例:1s 為間隔,執行一個耗時在 1s 內的任務。本篇不說明此種情況,這是大眾都能理解的。
「固定時間間隔」執行某個「耗時」任務
? ? 例:1s 為間隔,執行一個耗時超過 1s 的任務。如,定時取內存數據存入數據庫。
接下來是 C# 中涉及的三種定時器,本篇主要想說明上面第二種情況,以 1s 為間隔,執行一個耗時2s 的任務
① System.Timers.Timer
使用 System.Timers.Timer會發現定時器并沒有受「2s任務耗時」影響,依舊是1s執行一次
② System.Windows.Forms.Timer
使用 System.Windows.Forms.Timer? 會發現定時器是2s執行一次
③ System.Threading.Timer
使用 System.Threading.Timer 會發現定時器也并沒有受「2s任務耗時」影響,依舊是1s執行一次
當需要使用「System.Timers.Timer」和「System.Threading.Timer」按時間順序定時執行某些耗時操作時,這里就會存在問題,當執行耗時操作過程中,定時器會多次觸發,事實上這不是我們想看到的。下面一個小技巧解決這個問題。
第一個能想到是:加一把鎖不就好了,代碼如下
確實,這樣做能夠實現「按時間順序定時執行某些耗時操作」,但存在一個問題,由于每秒都會出發定時器,所以會有大量「待執行」被阻塞在 lock (obj) 這里,這是劃不來這種代碼短時間內看出不出「厲害關系」,但長時間執行一定是一個大坑。
下面一個小技巧完美解決上邊的問題:讓被阻塞的線程直接返回
最終結果: