1. 程式人生 > 其它 >Thread.Sleep(1000)和Task.Delay(1000)的區別

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

轉載:Task.Delay() 和 Thread.Sleep() 區別_zxf347085420的部落格-CSDN部落格

一、

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() 使當前執行緒休眠給定時間。

二、區別:

1、同步延遲

using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace MessagePump
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

//點選按鈕後,按鈕的處理程式
private void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
//1.禁用按鈕:這樣在處理程式執行期間,使用者就不能再次點選了
btnDoStuff.IsEnabled = false;
//2.將標籤文字改為Doing Stuff
lblStatus.Content = "Doing Stuff";
//3.將程式休眠4s:模擬某個工作
Thread.Sleep(4000);
//4.將標籤文字改為原始文字
lblStatus.Content = "Not Doing Anything";
//5.啟用按鈕
btnDoStuff.IsEnabled = true;
}


}
}

當點選按鈕後,什麼都沒有發生。而且如果在點選按鈕後移動窗體,會發現它已經凍結,不會移動---直到4s之後,窗體才突然出現在新位置。

2、非同步延遲---使用async/await特性

using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace MessagePump
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private async void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff";

//處理程式的訊息佇列中:先將上面2行程式碼壓入訊息佇列,將下面的delay訊息先從處理器上摘下來,等4s之後,再將自己壓入佇列。那麼:所有的訊息就不用等待了,這就可以保持GUI的實時響應了。

//當到達await 語句時,處理程式返回到呼叫方法,這時處理器已經壓入佇列中的上面2條語句得以處理。

//等完成這裡的空閒任務(等待4s之後)後,接著繼續執行處理程式中的最後2條訊息。
await Task.Delay(4000);

//4s之後,文字又變為"Not Doing Anything"
lblStatus.Content = "Not Doing Anything";
btnDoStuff.IsEnabled = true;
}


}
}

非同步延遲,不會阻塞執行緒,窗體不會凍結,可以實時響應!!