當前位置: 妍妍網 > 碼農

C#中Task.Delay與Thread.Sleep的對比與實戰

2024-02-04碼農

在C#中,異步編程和多執行緒是兩個關鍵的編程概念,它們可以幫助我們編寫更高效、響應更快的程式碼。其中, Task.Delay Thread.Sleep 是兩個常用於控制執行緒或任務執行進度的技術。本文將對這兩個技術進行對比,並給出一些實戰範例。

Task.Delay

Task.Delay 是C#中用於建立異步等待一段時間的方法。它返回一個 Task ,這個 Task 在指定的時間間隔後完成。它是基於任務的異步模式,意味著它不會建立一個新的執行緒,而是使用現有的執行緒池執行緒。

語法 :

publicstatic Task Delay(int millisecondsTimeout, CancellationToken cancellationToken = default(CancellationToken))

範例 :

using System;
using System.Threading.Tasks;
classProgram
{
staticasync Task Main()
{
Console.WriteLine("Task started");
await Task.Delay(3000); // 等待3秒
Console.WriteLine("Task ended");
}
}

Thread.Sleep

Thread.Sleep 是C#中用於使當前執行緒暫停執行一段時間的方法。它會導致當前執行緒進入阻塞狀態,不消耗CPU時間。與 Task.Delay 不同, Thread.Sleep 會建立一個新的執行緒並使其休眠,這通常是不推薦的,因為它會消耗系統資源。

語法 :

publicstaticvoidSleep(int millisecondsTimeout);

範例 :

using System;
using System.Threading;
classProgram
{
staticvoidMain()
{
Console.WriteLine("Thread started");
Thread.Sleep(3000); // 休眠3秒
Console.WriteLine("Thread ended");
}
}

對比與實戰:

  1. 異步與阻塞 : Task.Delay 是異步的,它不會阻塞呼叫執行緒;而 Thread.Sleep 是阻塞的,它會阻塞當前執行緒。在UI應用程式中,阻塞執行緒會導致應用程式無響應,因此應避免使用 Thread.Sleep

  2. 資源消耗 : Thread.Sleep 會建立並銷毀一個額外的執行緒,這比 Task.Delay 更消耗資源。在大多數情況下,使用 Task.Delay 更為高效。

  3. 靈活性 : Task.Delay 可以接受一個 CancellationToken 參數,這使得它可以很容易地整合到取消邏輯中。而 Thread.Sleep 沒有這樣的功能。

  4. 實戰範例 : 考慮一個簡單的UI應用程式,其中有一個按鈕,點選後會顯示一條訊息,然後等待3秒後顯示另一條訊息。使用 Task.Delay :

privateasyncvoidButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Message 1");
await Task.Delay(3000); // 等待3秒,不會阻塞UI執行緒
MessageBox.Show("Message 2");
}

而使用 Thread.Sleep : (不推薦)

privatevoidButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Message 1");
Thread.Sleep(3000); // 阻塞UI執行緒,不推薦這樣做!
MessageBox.Show("Message 2");
}