Sự khác biệt lớn nhất giữa Task.Delay
và Thread.Sleep
đó Task.Delay
là dự định chạy không đồng bộ. Nó không có ý nghĩa để sử dụng Task.Delay
trong mã đồng bộ. Đó là một ý tưởng RẤT xấu để sử dụng Thread.Sleep
trong mã không đồng bộ.
Thông thường bạn sẽ gọi Task.Delay()
với await
từ 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.WriteLine
thay 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.Sleep
chí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.Delay
có 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 Stopwatch
Class nếu bạn cần thứ gì đó chính xác hơn). Thread.Sleep
vẫn liên kết Chủ đề của bạn, Task.Delay
phát hành nó để làm công việc khác trong khi bạn chờ đợi.