您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C#中Task.Delay()和Thread.Sleep()的區別是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1.Thread.Sleep()是同步延遲,Task.Delay()是異步延遲。
2.Thread.Sleep()會阻塞線程,Task.Delay()不會。
3.Thread.Sleep()不能取消,Task.Delay()可以。
4.Task.Delay()實質創建一個運行給定時間的任務,Thread.Sleep()使當前線程休眠給定時間。
5.反編譯Task.Delay(),基本上講它就是個包裹在任務中的定時器。
6.Task.Delay()和Thread.Sleep()最大的區別是Task.Delay()旨在異步運行,在同步代碼中使用Task.Delay()是沒有意義的;在異步代碼中使用Thread.Sleep()是一個非常糟糕的主意。通常使用await關鍵字調用Task.Delay()。
案例一:Thread.Sleep()和Task.Delay()比較
代碼:
static void Main(string[] args) { //阻塞,出現CPU等待... Task.Factory.StartNew(delegate { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ****** Start Sleep()******"); for (int i = 1; i <=10; i++) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "******Sleep******==>" + i); Thread.Sleep(1000);//同步延遲,阻塞一秒 } Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ******End Sleep()******"); Console.WriteLine(); }); //不阻塞 Task.Factory.StartNew(() => { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======StartDelay()======"); for (int i =1; i <=10; i++) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay====== ==>" + i); Task.Delay(1000);//異步延遲 } Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======"); Console.WriteLine(); }); Console.ReadLine(); Console.ReadKey(); }
結果:
通過運行結果截圖對比看出,Thread.Sleep()是同步延遲,Task.Delay()是異步延遲。
案例二:通過async/await實現Task.Delay()同步
代碼:
//該段代碼通過async/awatit實現“同步”Delay static void Main(string[] args) { Task.Factory.StartNew(async () => { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Start Delay()======"); for (int i = 1; i <=10; i++) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay======" + i); await Task.Delay(1000); } Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======"); }); Console.ReadKey(); }
結果:
運行結果可以看出,通過async/await實現了Task.Delay()同步
案例三:Task.Delay()取消
代碼:
class Program { #region CancellationTokenSource cts = new CancellationTokenSource(); void PutThreadSleep() { Thread.Sleep(5000); } async Task PutTaskDelay() { try { await Task.Delay(5000, cts.Token);//需要.net4.5的支持 } catch (TaskCanceledException ex) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff ==>") + ex.ToString()); } } private void ThreadSleep() { PutThreadSleep(); Console.WriteLine("Sleep : I am back"); } private async void TaskDelay() { await PutTaskDelay(); Console.WriteLine("Delay : I am back"); } private void CancelTaskDelay() { cts.Cancel(); } #endregion static void Main(string[] args) { #region Program p = new Program(); //不可取消 p.ThreadSleep(); //可取消 p.TaskDelay(); p.CancelTaskDelay(); #endregion Console.ReadKey(); } }
結果:
Task.Delay()取消,拋出異常信息。
關于C#中Task.Delay()和Thread.Sleep()的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。