最近的一個項目有一些地方需要用到定時功能,在設計過程中,突然發現.net的Timer類居然還有很多我以前沒有用過的功能,這里就跟大家分享一下
注:這里的Timer類特指System.Threading.Timer類
情景1:我需要服務器在每天的00:00點執行一個操作
我當開始想到的方法很2b,居然是設定定時器每個1分鍾去檢查時間,如果當前時間與00:00相差不超過1分鍾時,就執行操作!!!由於這段的代碼太過2b,所以就不放上來了!
我都不知道自己剛開始怎么會想到如此2的設計,幾乎剛把代碼寫完我自己就把這個方案個否定了,極度浪費資源不說,還不能精准的在00:00執行操作!
於是我又一次查看了msdn,msdn真是編程神器啊,現在我離開了它簡直是寸步難行了,我驚喜的發現Timer的構造函數中有這樣一個參數
這個dueTime參數不正是我需要的嗎?只不過我以前一般忽略了這個參數,直接將其置為0了!所以我立刻寫下了下面的代碼
var span = DateTime.Today.AddDays(1) - DateTime.Now; var timer = new Timer(callback, null, (int)span.TotalMilliseconds, 24 * 3600 * 1000);
於是在第二天的00:00,定時器就開始執行,然后每隔24小時執行一次,這樣就完美的達到了情景中的目標!
情景2:我需要每個5分鍾保存一次RichTextBox中的內容
這實際上就是一個類似Word的自動保存功能,剛開始我覺得很簡單,不就是定義一個5分鍾的定時器就了事嗎?后來想想不這么簡單,因為如果用戶不在RichTextBox更改任何內容,這是還是隔5分鍾保存一次就是資源浪費!於是可以將上述情景更加精確的描述為:
在用戶每次對RichTextBox的內容修改之后的5分鍾時,對RichTextBox中內容保存一次!
這樣又如何去實現呢?於是我又一次查看了MSDN,果然沒讓我失望,MSDN又一次給了我驚喜,請看下面的MSDN說明
這句話簡直就是為了解決情境中的問題說的啊!於是我立刻寫下了下面的代碼:
System.Threading.Timer timer = null; bool needSave = false; private void richTextBox1_TextChanged(object sender, EventArgs e) { if (timer == null) timer = new System.Threading.Timer(Callback, null, 5 * 60 * 1000, 0); else if (needSave) { needSave = false; timer.Change(5 * 60 * 1000, 0); } } void Callback(object state) { Save(); needSave = true; }
將period參數置為0,就意味着定時器只會執行一次,此時定時功能是依靠參數dueTime來實現的,Change函數可以重啟定時功能,並且每次RichTextBox中有內容的改變,定時器就會被重置,這樣就完美的解決了情境中的問題了!
以上圖片由“博客園”提供