Task.Delay() 和 Thread.Sleep() 區別


前言

這篇已經做了一個總結,我來

https://www.cnblogs.com/yy1234/p/8073732.html

1、Thread.Sleep 是同步延遲,Task.Delay異步延遲。

2、Thread.Sleep 會阻塞線程,Task.Delay不會。

3、Thread.Sleep不能取消,Task.Delay可以。

4、Task.Delay() 比 Thread.Sleep() 消耗更多的資源,但是Task.Delay()可用於為方法返回Task類型;或者根據CancellationToken取消標記動態取消等待

5、Task.Delay() 實質創建一個運行給定時間的任務, Thread.Sleep() 使當前線程休眠給定時間。

那么就用代碼來驗證一下吧。

正文

代碼如下:

static void Main(string[] args)
{
	var test = Test_Delay();
	Thread.Sleep(TimeSpan.FromSeconds(2));
	Stopwatch sw = new Stopwatch();
	sw.Start();
	test.Wait();
	sw.Stop();
	TimeSpan ts = sw.Elapsed;
	Console.WriteLine(ts.TotalMilliseconds);
	Console.ReadKey();
}
public static Task Test_Delay()
{
	Task delay1 = Task.Delay(TimeSpan.FromSeconds(5));
	return delay1;
}

結果是:

上面顯示大概監聽為3秒。這個表示了當前主線程在運行的時候,Task.Delay也在運行,這個只有在不同線程才可以實現。

然后呢,不同線程自然不會堵塞。

關於開銷的問題,那么用vs 左邊的性能測試測試一下。以前測過,代碼丟了。思路就是讓他們共同執行1000次,看下性能曲線。

因為Task.Delay 多開一個線程所以消耗更多,然而實際使用中一般用Task.Delay,因為高並發不希望線程堵塞,而且Task.Delay 可以取消。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM