Sự khác biệt lớn nhất giữa Task.Delayvà Thread.Sleepđó Task.Delaylà dự định chạy không đồng bộ. Nó không có ý nghĩa để sử dụng Task.Delaytrong mã đồng bộ. Đó là một ý tưởng RẤT xấu để sử dụng Thread.Sleeptrong mã không đồng bộ.
Thông thường bạn sẽ gọi Task.Delay() với awaittừ khóa:
await Task.Delay(5000);
hoặc, nếu bạn muốn chạy một số mã trước khi trì hoãn:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Đoán xem cái này sẽ in cái gì? Chạy trong 0,0070048 giây. Nếu chúng ta di chuyển await delayở trên Console.WriteLinethay vào đó, nó sẽ in Chạy trong 5,0020168 giây.
Hãy xem sự khác biệt với Thread.Sleep:
class Program
{
static void Main(string[] args)
{
Task delay = asyncTask();
syncCode();
delay.Wait();
Console.ReadLine();
}
static async Task asyncTask()
{
var sw = new Stopwatch();
sw.Start();
Console.WriteLine("async: Starting");
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
Console.WriteLine("async: Done");
}
static void syncCode()
{
var sw = new Stopwatch();
sw.Start();
Console.WriteLine("sync: Starting");
Thread.Sleep(5000);
Console.WriteLine("sync: Running for {0} seconds", sw.Elapsed.TotalSeconds);
Console.WriteLine("sync: Done");
}
}
Hãy thử dự đoán những gì nó sẽ in ...
async: Bắt đầu
async: Chạy trong 0,0070048 giây
đồng bộ hóa: Bắt đầu
async: Chạy trong 5,0119008 giây
async:
Đồng bộ hóa xong : Chạy trong 5,0020168 giây
đồng bộ hóa: Xong
Ngoài ra, thật thú vị khi nhận thấy rằng Thread.Sleepchính xác hơn nhiều, độ chính xác ms không thực sự là một vấn đề, trong khi Task.Delaycó thể mất tối thiểu 15-30ms. Chi phí hoạt động trên cả hai chức năng là tối thiểu so với độ chính xác ms mà chúng có (sử dụng StopwatchClass nếu bạn cần thứ gì đó chính xác hơn). Thread.Sleepvẫn liên kết Chủ đề của bạn, Task.Delayphát hành nó để làm công việc khác trong khi bạn chờ đợi.