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

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

為什么要放棄使用Thread.Sleep

2019-11-14 16:07:33
字體:
來源:轉載
供稿:網友

前言

此文并不是說要完全放棄使用Thread.Sleep,而是要說明在符合哪些情況下使用!

場景

很多時候,我們會需要一個定時服務來處理業務。

但并不是死死的每隔N分鐘執行一次那種,而是在一次處理完后,算好下一次處理的時間點。

當到達此時間點,觸發程序重新開始執行代碼。

 

普遍做法

  

普遍的情況下,都是使用while(true){Thread.Sleep()}來實現,廢話不多話,看代碼版本1:

class PRogram    {        static void Main(string[] args)        {            var workLists = new List<string>() { "任務1", "任務2", "任務3", "任務4" };            foreach (var task in workLists)            {                var thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Work.DoWork));                thread.Start(task);            }                  }    }

 

class Work    {        public static void DoWork(object target)        {            var taskType = target as string;            var interval = 1 * 60 * 1000;//處理失敗,1分鐘后重試            var maxTimes = 5;            var retryTimes = 0;            while (true)            {                while (retryTimes < maxTimes)                {                    var ok = Proccess(taskType);                    if (ok)                    {                        retryTimes = maxTimes;                    }                    else                    {                        retryTimes++;                        System.Threading.Thread.Sleep(interval);                    }                }                var tim = GetTotalMillisecondsForNext();//計算離下一次開始處理的時間                                System.Threading.Thread.Sleep(tim);//掛起一段時間后,重新喚醒                retryTimes = 0;            }        }        private static bool Proccess(string taskType)        {            Console.WriteLine("開始執行處理:{0}", taskType);            return true;        }        private static int GetTotalMillisecondsForNext()        {            //這里根據自己的業務來決定            return 2 * 1000;        }    }

 代碼簡單易懂。

 

分析

版本1中,循環強制創建線程,并使用System.Threading.Thread.Sleep(tim)來掛起線程,然后重新喚醒。

這種方式不好之處在于:占用系統線程資源,是一種浪費。如同占著茅坑不拉屎!線程是一種十分寶貴的資源,創建,銷毀,切換 都是相當耗性能的。

當Sleep的時候,就等于說:現在我不用,但是你也別想用。你要用?自己去Create一個。

有的人說,Sleep的時候 不占用CPU??!對,是不占用CPU ,但是占著線程資源,阻礙系統的線程調度!

可以參考下這文章

Threads are a limited resource, they take approximately 200,000 cycles to create and about 100,000 cycles to destroy. By default they reserve 1 megabyte of virtual memory for its stack and use 2,000-8,000 cycles for each context switch. This makes any waiting thread a huge waste.

 

改進

  使用System.Timers.Timer來改進我們的程序。當執行處理業務的代碼時,首先把timer停止,處理完畢后,算好一次執行的時間點,賦給timer并啟動,看代碼版本2

class Program    {        static void Main(string[] args)        {            var workLists = new List<string>() { "任務1", "任務2", "任務3", "任務4" };            Parallel.ForEach(workLists,                new ParallelOptions() { MaxDegreeOfParallelism = 3 },                (task) => { new Work2() { TaskType = task }.DoWork(); });            Console.ReadLine();        }    }
 class Work2    {        private Timer _workTimer;        public string TaskType { get; set; }        public void DoWork()        {            _workTimer = new System.Timers.Timer();            _workTimer.Interval = 1000;            _workTimer.Elapsed += new ElapsedEventHandler(TimerHanlder);            _workTimer.Start();        }        private void TimerHanlder(object sender, ElapsedEventArgs e)        {            _workTimer.Stop();            var interval = 1 * 60 * 1000;//處理失敗,1分鐘后重試            var maxTimes = 5;            var retryTimes = 0;            while (retryTimes < maxTimes)            {                var ok = Proccess();                if (ok)                {                    retryTimes = maxTimes;                }                else                {                    retryTimes++;                    System.Threading.Thread.Sleep(interval);                }            }            var times = GetTotalSecondsForNext();            Console.WriteLine("{0}秒后重新執行", times);            _workTimer.Interval = times * 1000;//計算離下一次開始處理的時間            _workTimer.Start();        }        private bool Proccess()        {            Console.WriteLine("開始執行處理:{0}", TaskType);            return true;        }        private int GetTotalSecondsForNext()        {            //這里根據自己的業務來決定            return 3;        }    }

特別說明一下:Main方法中的Console.ReadLine();很重要,讓主線程處于等待的狀態,子線程就可以一直執行下去不中斷

總結

1:使用Task,而不是使用new System.Threading.Thread。是否要創建線程,應該讓系統來決定,利用可復用資源

2: System.Threading.Thread.Sleep(interval);只合適在 "有限度的 " 循環場景中,比如 最多重試N次、倒計時等等

 

 

如果不對之處,請各位斧正!

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品吹潮在线观看| 在线亚洲男人天堂| 国产精品夜色7777狼人| 日韩精品有码在线观看| 亚洲色图欧美制服丝袜另类第一页| 欧美激情18p| 国产日韩欧美夫妻视频在线观看| 精品国产欧美一区二区三区成人| 少妇高潮久久久久久潘金莲| 中文字幕成人精品久久不卡| 91国产美女视频| 欧美在线观看网址综合| 国产欧美在线看| 欧美激情按摩在线| 日韩免费精品视频| 尤物精品国产第一福利三区| 欧美在线视频播放| 91伊人影院在线播放| 欧美成人剧情片在线观看| 欧美日韩一二三四五区| 欧美日韩日本国产| 亚洲免费一级电影| 国产精品久久一区主播| 中文字幕国产亚洲2019| 欧美视频在线观看免费网址| 中国日韩欧美久久久久久久久| 亚洲开心激情网| 久久精品国产91精品亚洲| 国产噜噜噜噜噜久久久久久久久| 日本在线观看天堂男亚洲| 亚洲2020天天堂在线观看| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩免费观看中文| 欧美日韩在线视频首页| 欧美性感美女h网站在线观看免费| 狠狠躁天天躁日日躁欧美| 国产成人一区三区| 欧美日韩国产限制| 18一19gay欧美视频网站| 欧美性猛交xxxx免费看| xvideos成人免费中文版| 国产欧美精品日韩精品| 国产精品99久久久久久白浆小说| 欧美成人免费在线观看| 国产精品第一第二| 丝袜亚洲欧美日韩综合| 日本aⅴ大伊香蕉精品视频| 欧美理论电影在线播放| 少妇高潮 亚洲精品| 久久久久久久999精品视频| 精品magnet| 国产国语videosex另类| 国产精品永久免费在线| 国产视频精品va久久久久久| 亚洲男人第一av网站| 97人洗澡人人免费公开视频碰碰碰| 久久久精品久久久久| 久久久国产在线视频| 国产精品永久免费| 日本精品免费一区二区三区| 亚洲国产精品字幕| 国产精品久久电影观看| 国产精品69精品一区二区三区| 伊人av综合网| 欧美成人精品不卡视频在线观看| 日韩av综合中文字幕| 亚洲激情在线视频| 最近2019年中文视频免费在线观看| 在线播放日韩专区| 国产大片精品免费永久看nba| 5566日本婷婷色中文字幕97| 日韩av有码在线| 久久久免费观看视频| 日韩av日韩在线观看| 日本高清不卡的在线| 日韩a**中文字幕| 日韩欧美国产一区二区| 最新国产精品亚洲| 国产丝袜一区二区| 国产欧美日韩最新| 日韩美女视频免费在线观看| 国产精品激情自拍| 久热精品视频在线观看| 久久国产精彩视频| 亚洲影视九九影院在线观看| 欧美限制级电影在线观看| 国产精品久久视频| 丁香五六月婷婷久久激情| 国产精品亚洲网站| 国产性色av一区二区| 91在线直播亚洲| 成人乱人伦精品视频在线观看| 国产在线高清精品| 91日韩在线播放| 欧美片一区二区三区| 亚洲成人久久电影| 欧美大成色www永久网站婷| 欧美专区福利在线| 亚洲最新在线视频| 日韩av在线网| 亚洲视频第一页| 亚洲欧美日韩综合| 国产精品高精视频免费| 国产欧美一区二区三区视频| 成人两性免费视频| 国产精品成人一区二区| 91香蕉嫩草影院入口| 成年人精品视频| 中文字幕一区二区精品| 亚洲精美色品网站| 国产免费一区视频观看免费| 亚洲成在人线av| 国产成人高清激情视频在线观看| 欧美肥老妇视频| 26uuu日韩精品一区二区| 在线观看久久av| 欧美成人精品h版在线观看| 亚洲精品视频中文字幕| 影音先锋欧美精品| 欧美巨乳在线观看| 日本在线精品视频| 宅男66日本亚洲欧美视频| 91在线|亚洲| 日韩精品高清在线| 国产精品成人播放| 欧美色视频日本版| 久久理论片午夜琪琪电影网| 91免费精品视频| 亚洲第一中文字幕在线观看| 精品中文字幕在线观看| 国产精品xxxxx| 97香蕉超级碰碰久久免费软件| 亚洲一区二区三区xxx视频| 欧美日韩精品二区| 69**夜色精品国产69乱| 欧美成人黑人xx视频免费观看| 78色国产精品| 91国产视频在线播放| 日韩中文字幕视频在线观看| 亚洲男人av电影| 欧美性猛交xxxx免费看漫画| 亚洲精品美女视频| 中文字幕国产精品久久| 国产91|九色| 国产精品视频久久久| 国模视频一区二区三区| 亚洲午夜未删减在线观看| 色樱桃影院亚洲精品影院| 国产日韩在线视频| 久久久久久尹人网香蕉| 奇门遁甲1982国语版免费观看高清| 亚洲人成在线一二| 欧美成人精品不卡视频在线观看| 91欧美精品成人综合在线观看| 国产精品中文字幕在线观看| 亚洲欧洲免费视频| 日韩色av导航| 成人欧美一区二区三区在线湿哒哒| 久久国产精品久久久久久久久久| 日韩精品中文在线观看| 欧美一区亚洲一区| 欧美乱妇高清无乱码| 欧美第一黄网免费网站| 91美女高潮出水|