7.C# 三種Timer

簡介:定時器一般用作「固定時間間隔」執行某個「任務」。

兩種情況:

「固定時間間隔」執行某個「不耗時」任務

? ? 例: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) 這里,這是劃不來這種代碼短時間內看出不出「厲害關系」,但長時間執行一定是一個大坑。

下面一個小技巧完美解決上邊的問題:讓被阻塞的線程直接返回

最終結果:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容