91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中Task.Delay()和Thread.Sleep()的區別是什么

發布時間:2021-06-11 13:55:52 來源:億速云 閱讀:247 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關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()是異步延遲。

C#中Task.Delay()和Thread.Sleep()的區別是什么

案例二:通過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()同步

C#中Task.Delay()和Thread.Sleep()的區別是什么

案例三: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()的區別是什么

關于C#中Task.Delay()和Thread.Sleep()的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平武县| 南宫市| 锦屏县| 通化市| 襄城县| 荣昌县| 凭祥市| 乐山市| 浮梁县| 甘南县| 柯坪县| 永城市| 大同市| 雅江县| 铁岭县| 剑川县| 无极县| 寿光市| 闻喜县| 汶上县| 荥阳市| 名山县| 怀安县| 阜宁县| 柳江县| 宜章县| 邵阳县| 上杭县| 浦江县| 开鲁县| 合阳县| 达州市| 岱山县| 乌拉特后旗| 本溪市| 尖扎县| 通山县| 延吉市| 西吉县| 禹州市| 碌曲县|