亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現自定義定時組件的方法

2020-01-24 02:31:42
字體:
來源:轉載
供稿:網友

本文實例展示的是一個自定義的定時器組件,有別于.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只是對所有周期任務的一個管理,統一去開啟或暫停某一類的任務。

時間計算模塊

  那首先來介紹一下定義的字符串模式?,F在遇到的周期是有兩種模式,

一種是每隔多長時間要執行一次的任務,這個是最普通的周期形式,以每個5分鐘為例,完整的形式是“-99--99--99 -99:05:00”,“-99”是缺省的意思,當然還有其他簡寫的模式;

另一種是沒到什么什么時候執行一次任務,例如沒到中午12點為例完整的形式是“ff-ff-ff 12: ff:ff”,“ff”是默認的形式,當然也可以用“FF”,這里也有其他簡寫的模式。

所有字符串的模式如下表所示

  每到***時刻 每隔***時間
完整 ffff-ff-ff ff:ff:ff 或
ff-ff-ff ff:ff:ff
-99--99--99 -99:-99:-99
日期部分 ffff-ff-ff 或
ff-ff-ff
-99--99--99
時間部分 ff:ff:ff 或
ff:ff:ff
-99:-99:-99
時間簡寫 ff:ff 或
ff:ff
-99:-99

  那么時間計算模塊的處理流程是,給定了相應的模式字符串,TimePointConverter借助正則表達式匹配出對應的模式,返回匹配出來的年月日時分秒各個值,得出結果之后就調用SleepTimeProvider來計算出線程所要休眠的時間。下面則展示一下兩個類的部分代碼

public class TimePointConverter{//其他成員private int[] DateTimeFixBuilder(string timeStr){int[] result = null;string[] dtArray = timeStr.Split();string[] dateArray = dtArray[0].Split('-');string[] timeArray = dtArray[1].Split(':');uint year,month,date;uint hour, minute, second; uint.TryParse(dateArray[0], out year);uint.TryParse(dateArray[1], out month);uint.TryParse(dateArray[2], out date);uint.TryParse(timeArray[0], out hour);uint.TryParse(timeArray[1], out minute);uint.TryParse(timeArray[2], out second);//return InnerFixBuilder(year, month, date, hour, minute, second);result = new int[] { (int)year, (int)month, (int)date, (int)hour, (int)minute, (int)second };return result;}//其他成員}
public class SleepTimeProvider{//其他成員public TimeSpan InnerFixBuilder(uint year, uint month, uint date, uint hour, uint minute, uint second){uint[] uintTimeArray = new uint[6] { year, month, date, hour, minute, second };int[] intNowArray = new int[6] { DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute,DateTime.Now.Second };int[] intTimeArray = new int[6];intTimeArray[0] = uintTimeArray[0] == 0 ? -DateTime.Now.Year : (int)uintTimeArray[0];for (int i = 1; i < uintTimeArray.Length; i++){intTimeArray[i] = intTimeArray[i - 1] < 0 && uintTimeArray[i] == 0 ?-intNowArray[i] : (int)uintTimeArray[i];}DateTime goalTime = new DateTime(Math.Abs(intTimeArray[0]),Math.Abs(intTimeArray[1]),Math.Abs(intTimeArray[2]),Math.Abs(intTimeArray[3]),Math.Abs(intTimeArray[4]),Math.Abs(intTimeArray[5]));if (goalTime < DateTime.Now){int max = -1;for (int i = intTimeArray.Length - 1; i >= 0; i--){if (intTimeArray[i] < 0 && i > max){max = i;intTimeArray[i]--;}intTimeArray[i] = Math.Abs(intTimeArray[i]);}goalTime = new DateTime(Math.Abs(intTimeArray[0]),Math.Abs(intTimeArray[1]),Math.Abs(intTimeArray[2]),Math.Abs(intTimeArray[3]),Math.Abs(intTimeArray[4]),Math.Abs(intTimeArray[5]));}return goalTime - DateTime.Now;}//其他成員}

線程調用模塊

  線程調用模塊是任務執行的核心部分,MissionEntiy是對線程操作的封裝,主要負責開始,停止,暫停等操作。Thread用的是后臺線程,對線程操作時也多做幾個判斷。例如暫停那個操作的定義如下

public bool Pause(){if (actionThread == null) return false;if (actionThread.ThreadState == (System.Threading.ThreadState.Running | ThreadState.Background) ||actionThread.ThreadState == (System.Threading.ThreadState.WaitSleepJoin | ThreadState.Background)){actionThread.Suspend();return true;}return false;}

CycleMission是真正的任務載體,里面都同樣有對線程的操作,但是又外加了一些時間處理,最核心的是讓線程的BuildMainAction方法,這個方法是計算出要休眠的時間,讓線程休眠,到點時調用適當的方法委托。

public class BaseCycleMission:ICycleMission{//其他成員protected void BuildMainAction(string normalCycle, string overTimeCycle, object overTimeDelegate, bool isSleepBefore,bool isInclude){mainAction = () =>{TimeSpan sleepTime=TimeSpan.MinValue;bool result = true;TimePointConvert.CircleType type ;#region 提前休眠if (isSleepBefore){type = TimePointConvert.Default.PraseType(normalCycle); if (type == TimePointConvert.CircleType.Interval)sleepTime = SleepTimeProvider.Defult.InnerIntervalBuilder(TimePointConvert.Default.ConvertCircle(normalCycle));elsesleepTime = SleepTimeProvider.Defult.InnerFixBuilder(TimePointConvert.Default.ConvertCircle(normalCycle));if (sleepTime.TotalMilliseconds > 0)Thread.Sleep(sleepTime);}#endregionwhile (true){#region 計算時間if (isInclude){if (result){type = TimePointConvert.Default.PraseType(normalCycle); type = TimePointConvert.Default.PraseType(overTimeCycle); sleepTime = type == TimePointConvert.CircleType.Interval ?SleepTimeProvider.Defult.InnerIntervalBuilder(TimePointConvert.Default.ConvertCircle(overTimeCycle)) :SleepTimeProvider.Defult.InnerFixBuilder(TimePointConvert.Default.ConvertCircle(overTimeCycle));}}#endregion#region 執行方法if(overTimeDelegate is OverTimeCycleDelegate)result = (overTimeDelegate as OverTimeCycleDelegate).Invoke();else{(overTimeDelegate as CycleDelegate).Invoke();result = true;}#endregion#region 計算時間if (!isInclude){if (result){type = TimePointConvert.Default.PraseType(normalCycle);sleepTime = type == TimePointConvert.CircleType.Interval ?SleepTimeProvider.Defult.InnerIntervalBuilder(TimePointConvert.Default.ConvertCircle(normalCycle)) :SleepTimeProvider.Defult.InnerFixBuilder(TimePointConvert.Default.ConvertCircle(normalCycle));}else{type = TimePointConvert.Default.PraseType(overTimeCycle);sleepTime = type == TimePointConvert.CircleType.Interval ?SleepTimeProvider.Defult.InnerIntervalBuilder(TimePointConvert.Default.ConvertCircle(overTimeCycle)) :SleepTimeProvider.Defult.InnerFixBuilder(TimePointConvert.Default.ConvertCircle(overTimeCycle));}}#endregionif (sleepTime.TotalMilliseconds > 0)Thread.Sleep(sleepTime);}};}//其他成員}

當然調用不是調用這個方法,調用只是調用它兩個幾類ExceptCycleMission和IncludeCycleMission,分別代表任務執行的時間不包括在周期里面和包括在周期里面兩種。

管理器部分

  管理器主要是一個字典集,是一個ICycleMission和字符串的字典集,里面包含了對集合里面所有元素的操作:增加,刪除,運行,恢復,暫停,停止。除了刪除和增加,其他都包含了類似下面的方法

RunAllMission()RunAllIncludeCycleMission()RunAllExceptCycleMission()RunMissionAmong(params string[] missionNames)RunMissionExcept(params string[] missionNames)

但是這堆方法里面都調用了CallAction這個方法,

private void CallAction(IEnumerable<ICycleMission> missionCollection,Action method){if (missionCollection == null || method == null||missionCollection.Count()==0) return;foreach (ICycleMission item in missionCollection){method.Method.Invoke(item, null);}}

例如在RunAllExceptCycleMission()方法里面調用如下

public void RunAllExceptCycleMission(){CallAction(this.Values.Where(c => c is ExceptCycleMission), BaseCycleMission.Default.RunMission);}

  感興趣的朋友可以測試一下本文所述實例代碼,相信會有不小的收獲!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色偷偷噜噜噜亚洲男人| 久久久中精品2020中文| 国产免费一区二区三区在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 成人观看高清在线观看免费| 97香蕉久久超级碰碰高清版| 久久九九热免费视频| 亚洲精品视频在线观看视频| 在线精品高清中文字幕| 成人a在线观看| 欧美激情乱人伦一区| 亚洲色图17p| 亚洲美腿欧美激情另类| 色偷偷av亚洲男人的天堂| 欧美超级乱淫片喷水| 国产综合在线视频| 69av视频在线播放| 久久视频精品在线| 欧美特级www| 一区二区三区精品99久久| 日韩va亚洲va欧洲va国产| 国产精彩精品视频| 亚洲第一精品夜夜躁人人躁| 国产97在线观看| 精品视频久久久久久| 久久久久久久久久av| 欧美最猛性xxxx| 日韩女优人人人人射在线视频| 欧美激情精品在线| 欧美视频在线视频| 在线观看日韩www视频免费| 日韩在线观看高清| 欧美日韩精品二区| 国产mv免费观看入口亚洲| 中文字幕欧美日韩精品| 成人免费黄色网| 精品美女久久久久久免费| 国产精品揄拍500视频| 欧洲精品久久久| 国语自产精品视频在线看一大j8| 亚洲精品av在线播放| 北条麻妃99精品青青久久| 欧美整片在线观看| 精品国产91久久久久久| 久久99热精品这里久久精品| 18久久久久久| 日韩欧美在线视频免费观看| 国产免费一区二区三区在线能观看| 色香阁99久久精品久久久| 日韩国产在线播放| 日韩av电影中文字幕| 久久99热这里只有精品国产| 热久久99这里有精品| 精品亚洲一区二区三区四区五区| 国产精品网红直播| 久久91亚洲精品中文字幕奶水| 亚洲国产另类 国产精品国产免费| 亚洲在线免费观看| 欧美日韩精品在线视频| 欧美日本高清一区| 中文字幕日本精品| 亚洲一二三在线| 亚洲国产精品va在线看黑人| 成人免费xxxxx在线观看| 国产综合视频在线观看| 亚洲欧美日韩另类| 欧美久久精品一级黑人c片| 日韩经典一区二区三区| 久久免费精品视频| 国产一区二区三区视频在线观看| 久久精品视频一| 国产美女精品视频免费观看| 日韩在线视频播放| 欧美日韩视频免费播放| 亚洲女人天堂视频| 日韩av在线网页| 欧美激情女人20p| 国产美女高潮久久白浆| 欧美大成色www永久网站婷| 国产精品偷伦一区二区| 久久久久久亚洲精品中文字幕| 不卡在线观看电视剧完整版| 亚洲娇小xxxx欧美娇小| 精品视频在线播放色网色视频| 色先锋资源久久综合5566| 国产999精品| 中文字幕日韩电影| 国产精品中文字幕久久久| 久久99精品久久久久久琪琪| 深夜福利日韩在线看| 美日韩精品免费视频| 国产主播欧美精品| 色哟哟网站入口亚洲精品| 久久久久99精品久久久久| 欧美成人在线免费| 国产美女主播一区| www.日韩免费| 色偷偷9999www| 国产一区av在线| 亚洲第一国产精品| 国产激情久久久久| 国产精品一区久久| 中文.日本.精品| 亚洲视频一区二区三区| 一本一本久久a久久精品牛牛影视| 国产精品日韩欧美| 亚洲欧洲一区二区三区久久| 欧美激情手机在线视频| 超在线视频97| 亚洲综合在线做性| 中文欧美日本在线资源| 欧美性xxxx极品hd满灌| 日本aⅴ大伊香蕉精品视频| 欧美性20hd另类| 少妇高潮 亚洲精品| 久久免费观看视频| 欧美与欧洲交xxxx免费观看| 久久成人av网站| 国产成人极品视频| 精品日韩美女的视频高清| 精品国产户外野外| 欧美黑人xxx| 国产精品成人观看视频国产奇米| 少妇高潮久久久久久潘金莲| 日韩在线观看免费高清完整版| 亚洲黄色免费三级| 欧美黑人国产人伦爽爽爽| 4438全国亚洲精品在线观看视频| 狠狠躁夜夜躁人人爽超碰91| 亚洲国产精品嫩草影院久久| 欧美精品在线看| 成人黄色午夜影院| 欧美精品video| 国产日产欧美a一级在线| 亚洲精品中文字| 国内精品美女av在线播放| 亚洲精品电影网在线观看| 成人在线视频福利| 国产一区二区激情| 成人观看高清在线观看免费| 日韩精品中文在线观看| 亚洲天堂色网站| 98精品国产自产在线观看| 亚洲网站在线播放| 国产精品一香蕉国产线看观看| 欧美孕妇性xx| 2021国产精品视频| 欧美一级片一区| 在线观看欧美视频| 啪一啪鲁一鲁2019在线视频| 国产精品久久久91| 亚洲女同性videos| 久久久久久999| 一本一本久久a久久精品牛牛影视| 久久av资源网站| www.欧美精品一二三区| 欧美午夜宅男影院在线观看| 揄拍成人国产精品视频| 色爱av美腿丝袜综合粉嫩av| 伊人久久久久久久久久久久久| 亚洲欧美激情在线视频| 91福利视频网| 亚洲第一天堂无码专区| 精品国偷自产在线|