前言
這篇已經做了一個總結,我來
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 可以取消。