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;
}
}
}
非同步延遲,不會阻塞執行緒,窗體不會凍結,可以實時響應!!