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

首頁 > 編程 > .NET > 正文

為什么要放棄使用Thread.Sleep

2024-07-10 13:29:59
字體:
來源:轉載
供稿:網友

前言

此文并不是說要完全放棄使用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
影音先锋欧美在线资源| 欧美精品videos另类日本| 国产精品成人v| 国产精品看片资源| 九九久久国产精品| 欧美裸体xxxx极品少妇| 国内精品视频久久| 日韩av一区在线观看| 亚洲一区二区三区777| 国产精品九九久久久久久久| 92国产精品视频| 欧美三级免费观看| 一区二区三区国产在线观看| 国内精品一区二区三区| 亚洲国产精品久久久久秋霞不卡| 在线精品高清中文字幕| 国产精品久久久久久久久久久久久久| 最新国产精品亚洲| 国产精品露脸av在线| 成人激情av在线| 欧美色视频日本版| 日韩中文字幕在线视频| 国模私拍一区二区三区| 亚洲美女在线视频| 色偷偷888欧美精品久久久| 国产中文字幕亚洲| 欧美性猛交xxxxx水多| 91免费看片网站| 国产成人极品视频| 26uuu久久噜噜噜噜| 正在播放欧美视频| 国产精品精品视频| 久久综合伊人77777蜜臀| 亚洲电影免费观看高清完整版在线| 亚洲国产精品女人久久久| 国产精品久久久久久久久久ktv| 亚洲国产日韩欧美在线图片| 国产精品主播视频| 成人综合网网址| 亚洲mm色国产网站| 欧美精品午夜视频| 国产美女91呻吟求| 久久香蕉精品香蕉| 欧美午夜美女看片| 亚洲片av在线| 亚洲欧美日韩第一区| 日韩综合视频在线观看| 国产精品video| 在线观看欧美日韩国产| 欧美在线一级视频| 亚洲韩国欧洲国产日产av| 欧美日韩国产区| 国产精品久久久久久久久久ktv| 久久好看免费视频| 91日韩在线视频| 久久精品国产一区二区电影| 日韩av影院在线观看| 国产精品一区二区女厕厕| 亚洲男人7777| 亚洲第一偷拍网| 欧美在线视频在线播放完整版免费观看| 欧美成人午夜视频| 亚洲国产精品电影在线观看| 97久久精品视频| 亚洲欧美三级在线| 欧美国产精品人人做人人爱| 中文字幕av一区中文字幕天堂| 国产精品青草久久久久福利99| 亚洲最大av网站| 欧洲精品毛片网站| 全色精品综合影院| 久久人人看视频| 国产美女精彩久久| 国产精品中文在线| 插插插亚洲综合网| 成人免费淫片aa视频免费| 成人免费观看49www在线观看| 中文字幕亚洲欧美日韩在线不卡| 98精品国产高清在线xxxx天堂| 黄色一区二区三区| 国产视频久久久| 成人两性免费视频| 欧美日韩亚洲视频一区| 亚洲欧美综合另类中字| 色在人av网站天堂精品| 亚洲男人天堂古典| 亚洲色图日韩av| 欧美一级淫片aaaaaaa视频| 欧美中文字幕视频在线观看| 亚洲黄页视频免费观看| 欧美日韩国产va另类| 亚洲aⅴ日韩av电影在线观看| 亚洲男人天堂古典| 国产精品91在线| 国产精品亚洲自拍| 亚洲第一男人av| 日韩电影在线观看永久视频免费网站| 成人精品久久久| 国产精品热视频| 亚洲欧美日韩网| 6080yy精品一区二区三区| 国产精品久久精品| 国产国语videosex另类| 中文字幕亚洲自拍| 在线播放日韩av| 久久韩剧网电视剧| 久久精品男人天堂| 日韩av网站导航| 777国产偷窥盗摄精品视频| 日韩久久免费电影| 国产精品最新在线观看| 俺去亚洲欧洲欧美日韩| 欧美日韩精品二区| 中文字幕欧美在线| 国产精品爽爽爽| 97久久精品人搡人人玩| 亚洲精品不卡在线| 亚洲精品在线91| 欧美成人午夜剧场免费观看| 国产日韩在线观看av| 色悠悠国产精品| 久久综合久久八八| 亚洲国产高清高潮精品美女| 欧美日韩美女在线观看| 国产偷国产偷亚洲清高网站| 国产在线视频一区| 91精品免费看| 黑人精品xxx一区一二区| xxxx欧美18另类的高清| 国产国语videosex另类| 国产精品成人观看视频国产奇米| 日本91av在线播放| 国产亚洲a∨片在线观看| 国产精品视频不卡| 亚洲性视频网址| 92国产精品久久久久首页| 欧美丰满老妇厨房牲生活| 亚洲视屏在线播放| 国产精品6699| 久久亚洲私人国产精品va| 久久综合九色九九| 97国产suv精品一区二区62| 尤物九九久久国产精品的特点| 欧美性在线观看| 国产精品一区久久久| 中文字幕精品在线视频| 日韩久久精品成人| 一区二区三区高清国产| 另类专区欧美制服同性| 91久久久久久久| 日韩av一区在线观看| 国产在线拍偷自揄拍精品| 在线日韩日本国产亚洲| 亚洲免费视频在线观看| 高清视频欧美一级| 亚洲精品成人久久| 亚洲男女性事视频| 日本在线观看天堂男亚洲| 欧洲美女免费图片一区| 欧美一乱一性一交一视频| 亚洲视频精品在线| 久久精品视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 久久久久99精品久久久久|