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

首頁 > 學院 > 開發設計 > 正文

C# 線程系列三 定時器線程

2019-11-17 02:31:55
字體:
來源:轉載
供稿:網友

C# 線程系列三 定時器線程

上一篇文章我們講訴了自定義線程執行器和任務處理器

我們繼續來講解自定義線程的定時執行器,我們在很多場景下需要做到某些狀態或者數據進行更新,如果事情很多很雜,很時候時候會創建很多不同的定時器那么勢必會照成系統的消耗和性能低下的問題!今天我們來解決這一問題。

首先我們創建定時任務執行器基類

 1 /// <summary> 2     ///  3     /// </summary> 4     public abstract class TimerTaskBase : BaseTask 5     { 6  7  8         /// <summary> 9         /// 開始執行的時間10         /// </summary>11         public long StartTime { get; set; }12 13         /// <summary>14         /// 是否一開始執行一次15         /// </summary>16         public bool IsStartAction { get; set; }17 18         /// <summary>19         /// 結束時間20         /// </summary>21         public long EndTime { get; set; }22 23         /// <summary>24         /// 執行次數25         /// </summary>26         public int ActionCount { get; set; }27 28         /// <summary>29         /// 已經執行的次數30         /// </summary>31         public int AActionCount { get; set; }32 33         /// <summary>34         /// 間隔執行時間35         /// </summary>36         public int IntervalTime { get; set; }37 38         /// <summary>39         /// 制定執行次數的定時任務40         /// </summary>41         /// <param name="startTime">0表示立即執行,否則延遲執行,填寫開始時間</param>42         /// <param name="intervalTime">執行間隔時間,小于10毫秒,當10毫秒處理</param>43         /// <param name="isStartAction">是否一開始執行一次</param>44         /// <param name="actionCount">需要執行的次數</param>45         public TimerTaskBase(long startTime, int intervalTime, bool isStartAction, int actionCount)46         {47             this.StartTime = startTime;48             this.IntervalTime = intervalTime;49             this.IsStartAction = isStartAction;50             this.ActionCount = actionCount;51             this.EndTime = 0;52         }53 54         /// <summary>55         /// 制定結束時間的定時任務56         /// </summary>57         /// <param name="startTime">0表示立即執行,否則延遲執行,填寫開始時間</param>58         /// <param name="intervalTime">執行間隔時間,小于10毫秒,當10毫秒處理</param>59         /// <param name="endTime">執行結束時間</param>60         /// <param name="isStartAction">是否一開始執行一次</param>61         public TimerTaskBase(long startTime, int intervalTime, long endTime, bool isStartAction)62         {63             this.StartTime = startTime;64             this.IntervalTime = intervalTime;65             this.IsStartAction = isStartAction;66             this.ActionCount = 0;67             this.EndTime = endTime;68         }69 70         /// <summary>71         /// 制定開始時間,無限執行任務72         /// </summary>73         /// <param name="startTime">0表示立即執行,否則延遲執行,填寫開始時間</param>74         /// <param name="intervalTime">執行間隔時間,小于10毫秒,當 10 毫秒處理 建議 10 毫秒的倍數</param>75         /// <param name="isStartAction">是否一開始執行一次</param>76         public TimerTaskBase(long startTime, int intervalTime, bool isStartAction)77         {78             this.StartTime = startTime;79             this.IntervalTime = intervalTime;80             this.IsStartAction = isStartAction;81             this.ActionCount = 0;82             this.EndTime = 0;83         }84 85         public TimerTaskBase()86         {87             // TODO: Complete member initialization88         }89     }

上面的代碼實現了,開始時間,間隔時間,結束時間和執行次數 的控制

那么我們來看看定時器線程的設計

 1 public class TimerThread  2     { 3         public TimerThread() 4         { 5             System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Run)); 6             thread.IsBackground = true; 7             thread.Start(); 8         } 9 10         /// <summary>11         /// 任務隊列12         /// </summary>13         PRivate List<TimerTaskBase> taskQueue = new List<TimerTaskBase>();14 15         /// <summary>16         /// 加入任務17         /// </summary>18         /// <param name="t"></param>19         public void AddTask(TimerTaskBase t)20         {21             if (t.IsStartAction)22             {23                 //滿足添加隊列前先執行一次24                 t.Run();25             }26             lock (taskQueue)27             {28                 taskQueue.Add(t);29             }30         }31 32         public long GetDate()33         {34             return Convert.ToInt64(System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));35         }36 37         //這里的線程同步器,不是用來通知的,38         //只是用來暫停的,因為Thread.Sleep() 消耗開銷比較大39         ManualResetEvent mre = new ManualResetEvent(false);40 41         /// <summary>42         /// 重構函數執行器43         /// </summary>44         private void Run()45         {46             ///無限循環執行函數器47             while (true)48             {49                 if (taskQueue.Count > 0)50                 {51                     IEnumerable<TimerTaskBase> collections = null;52                     lock (taskQueue)53                     {54                         //拷貝一次隊列 預防本次輪訓檢查的時候有新的任務添加55                         //否則循環會出錯 集合被修改無法迭代56                         collections = new List<TimerTaskBase>(taskQueue);57                     }58                     //開始迭代59                     foreach (TimerTaskBase tet in collections)60                     {61                         int actionCount = tet.AActionCount;62                         long timers = GetDate();63                         if ((tet.EndTime > 0 && timers > tet.EndTime) || (tet.ActionCount > 0 && actionCount >= tet.ActionCount))64                         {65                             //任務過期66                             lock (taskQueue)67                             {68                                 taskQueue.Remove(tet);69                             }70                             continue;71                         }72                         //獲取最后一次的執行時間73                         long lastactiontime = tet.TempAttribute.getlongValue("lastactiontime");74                         if (lastactiontime != 0 && Math.Abs(timers - lastactiontime) < tet.IntervalTime)75                         {76                             continue;77                         }78                         //記錄出來次數79                         tet.AActionCount++;80                         //記錄最后執行的時間81                         tet.TempAttribute.setValue("lastactiontime", timers);82 83                         //上面的代碼執行情況是非常幾乎不用考慮消耗問題84 85                         //下面是任務的執行需要考慮消耗,86 87                         //這里我們不考慮執行耗時問題,88                         //我們我這里沒有涉及到后臺線程池89                         //也沒有具體的業務邏輯,所以都放到這里統一執行90                         tet.Run();91                     }92                 }93                 //暫停10毫秒后再次檢查94                 mre.WaitOne(10);95             }96         }97     }

定時器為什么沒有使用上一篇文章講訴的自定義線程呢,是因為,上一篇文章的自定義線程是基于隊列處理的,先進先出執行,而我們的定時器任務并非是基于隊列的。所以需要單獨定義。

那么我們先來實現一個每一秒執行的任務,

 1  /// <summary> 2     /// 每秒執行的任務 3     /// </summary> 4     public class SecondsTimerTask : TimerTaskBase 5     { 6         /// <summary> 7         /// 定義一秒執行一次的 8         /// </summary> 9         public SecondsTimerTask()10             : base(0, 1000, false)11         {12 13         }14 15         public override void Run()16         {17             Console.WriteLine(DateTime.Now.ToString("HH:mm:ss:ffff: ") + "我是 每秒 執行的任務");18         }19     }

我們來測試一下看看效果

1     class Program2     {3         static void Main(string[] args)4         {5             TimerThread timerThread = new TimerThread();6             timerThread.AddTask(new SecondsTimerTask());7             Console.ReadLine();8         }9     }

還算是我們的預想的效果吧,每秒執行一次

接下來我們創建每分鐘執行一次

 1     public class MinuteTimerTask : TimerTaskBase 2     { 3         /// <summary> 4         /// 定義一分鐘執行一次的 5         /// </summary> 6         public MinuteTimerTask() 7             : base(0, 1000 * 60, false) 8         { 9 10         }11 12         public o
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影免费观看高清| 欧美日韩激情美女| 九九九久久久久久| 精品国产拍在线观看| 精品毛片三在线观看| 久久天天躁狠狠躁老女人| 国产一区二区三区在线免费观看| 日韩视频在线观看免费| 2019中文字幕在线| 91中文在线观看| 精品国产老师黑色丝袜高跟鞋| 日韩av影视综合网| 日本一区二区三区四区视频| 欧美日韩久久久久| 丝袜美腿亚洲一区二区| 高清亚洲成在人网站天堂| 正在播放欧美视频| 亚洲sss综合天堂久久| 日韩人在线观看| 国产成人精品电影| 中文字幕成人精品久久不卡| 国产亚洲视频在线观看| 日韩精品在线视频观看| 91精品在线影院| 国产精品偷伦免费视频观看的| 在线日韩欧美视频| 91九色精品视频| 国产日韩欧美中文| 亚洲色图校园春色| 亚洲精品国产免费| 国产在线精品一区免费香蕉| 在线视频免费一区二区| 另类天堂视频在线观看| 日韩免费av一区二区| 精品日韩中文字幕| 欧美成人手机在线| 国产精品高潮呻吟视频| 色悠悠久久久久| 色爱av美腿丝袜综合粉嫩av| 亚洲精品电影久久久| 91九色视频导航| 午夜精品国产精品大乳美女| 欧美色视频日本高清在线观看| 国外成人免费在线播放| yellow中文字幕久久| 国产一区私人高清影院| 成人国内精品久久久久一区| 国产成人av网址| 亚洲国产一区二区三区在线观看| 欧美国产日本高清在线| 91av网站在线播放| 亚洲视频在线播放| 91精品啪aⅴ在线观看国产| 亚洲欧美综合精品久久成人| 91av视频在线观看| 亚洲91精品在线| 97视频在线观看免费高清完整版在线观看| 最近2019年好看中文字幕视频| 国产成人精品最新| 亚洲欧美综合精品久久成人| 91中文精品字幕在线视频| 亲爱的老师9免费观看全集电视剧| 日韩专区在线观看| 国产精品日韩专区| 国产成人午夜视频网址| 情事1991在线| 久久亚洲精品网站| 亚洲free嫩bbb| 欧美大片在线看| 免费av一区二区| 81精品国产乱码久久久久久| 久久成人在线视频| 美女精品视频一区| 亚洲国产成人在线视频| 欧美裸体xxxx极品少妇软件| 亚洲第五色综合网| 日韩av一区二区在线观看| x99av成人免费| 91九色单男在线观看| 日韩av在线不卡| 亚洲欧美中文字幕在线一区| 国产一区二区黄| 欧美性受xxxx白人性爽| 欧美久久精品一级黑人c片| 久久精品中文字幕| 亚洲xxxxx| 亚洲精品中文字幕女同| 2018国产精品视频| 亚洲аv电影天堂网| 欧美午夜性色大片在线观看| 欧美性xxxxx| 国产日韩欧美综合| 91在线视频精品| 日韩精品视频在线免费观看| 国产盗摄xxxx视频xxx69| 精品亚洲一区二区三区| 日韩久久午夜影院| 亚洲国产婷婷香蕉久久久久久| 伊人激情综合网| 久久天天躁夜夜躁狠狠躁2022| 欧美色欧美亚洲高清在线视频| 亚洲国产欧美一区二区丝袜黑人| 成人看片人aa| 欧美三级免费观看| 亚洲黄色成人网| 国产精品白嫩美女在线观看| 亚洲第一精品电影| 成人免费直播live| 免费97视频在线精品国自产拍| 91色精品视频在线| 欧美孕妇孕交黑巨大网站| 久久99精品国产99久久6尤物| 亚洲japanese制服美女| 亚洲一区av在线播放| 在线精品91av| 国产亚洲在线播放| 欧美xxxx14xxxxx性爽| 久久久精品在线观看| 国产精品高潮呻吟久久av无限| 亚洲第一偷拍网| 尤物99国产成人精品视频| 精品久久香蕉国产线看观看亚洲| 国产suv精品一区二区| 欧美专区国产专区| 欧美激情2020午夜免费观看| 国产在线观看一区二区三区| 97精品欧美一区二区三区| 国产一区二区三区在线播放免费观看| 国产亚洲a∨片在线观看| 色综合久综合久久综合久鬼88| 日韩福利伦理影院免费| 欧美激情图片区| 亚洲999一在线观看www| 成人黄色免费网站在线观看| 97在线视频免费| 九九久久综合网站| 成人免费在线视频网站| 亚洲人在线视频| 欧美日韩中国免费专区在线看| 欧美另类第一页| 不卡伊人av在线播放| 国产在线一区二区三区| 国产做受高潮69| 日韩一区二区福利| 欧美日在线观看| 精品自在线视频| 91九色精品视频| 日产日韩在线亚洲欧美| 中文字幕一区日韩电影| 国产精品一区二区三区免费视频| 欧美成人一区在线| 国产精品视频区1| 欧美性色视频在线| 中文字幕欧美精品日韩中文字幕| 亚洲国产成人久久综合一区| 丝袜情趣国产精品| 97超级碰碰人国产在线观看| 97在线精品视频| 亚洲国产小视频在线观看| 亚洲欧美综合另类中字| 国产成人自拍视频在线观看| 欧美激情xxxx性bbbb| 亚洲精品成人久久| 日韩av大片在线|