工作了這麼久,封裝過一部分Helper,也寫過一些控件,但也沒寫過屬於自己的框架,這次寫的這個我覺得是一個組件而已,是一個定時組件。是一個定時器組件,有別於.NET Framework裡面提供的幾個Timer。首先說說背景,就發現現在手頭上的工作離不開定時,定時做一個任務,什麼都是定時去做什麼什麼,隔某段時間干某件事情,都離不開“定時”這個詞。眾所周知這個要用到多線程,在多篇關於多線程的文章裡面有提過做一些周期性的操作時最好用Timer,當然這個Timer肯定是Threading.Timer,並不是WinForm控件裡面的Timer。但我覺得在我的應用中Timer不夠滿足需求。
1.Timer只能在做任務與任務之間相隔一段時間的操作,如下圖
但我需要的是這次任務開始的時刻到下次任務開始時刻是相隔同等的時間,又如下圖
這樣的情況下Timer則不能滿足需求。
2.Timer的時間間隔一般是定的,但是如果要每次執行完任務要變動一下休眠的時間, 則需要調用Timer的Change方法。
3.Timer的休眠時間不是通過整形確定休眠的毫秒數,就是用一個TimeSpan來確定,對於那種到每天多少多少時刻或者到每小時的多少分執行一次的任務來說也不能夠完全方便使用
對於上面這三種,鄙人對定時器封裝了一下,棄用了Timer,還是用回了原有的Thread,定義了一種描述重復時間的模式字符串,計算出TimeSpan,從而調用Thread的Sleep()方法來休眠。下面展示整個組件的類圖
最底下是兩個關於時間計算方面的類,兩個代理是兩種任務方法的委托,基類BaseCycleMission是周期任務的積累,實現了ICycle接口,主要進行對任務線程的操控(開始,停止等),繼承他的兩個子類一個是實現上文第一點中我後來描述那種需求,一個類似於原有Timer的功能。它們各自使用不同的委托。MissionManager只是對所有周期任務的一個管理,統一去開啟或暫停某一類的任務。
那首先來介紹一下定義的字符串模式。現在遇到的周期是有兩種模式,
所有字符串的模式如下表所示