Perbedaan terbesar antara Task.Delaydan Thread.Sleepadalah yang Task.Delaydimaksudkan untuk berjalan secara tidak sinkron. Tidak masuk akal untuk menggunakan Task.Delaykode sinkron. Ini adalah ide yang SANGAT buruk untuk digunakan Thread.Sleepdalam kode asinkron.
Biasanya Anda akan menelepon Task.Delay() dengan awaitkata kunci:
await Task.Delay(5000);
atau, jika Anda ingin menjalankan beberapa kode sebelum penundaan:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Coba tebak ini akan mencetak? Berjalan selama 0,0070048 detik. Jika kita memindahkan yang di await delayatas Console.WriteLine, itu akan mencetak Running selama 5.0020168 detik.
Mari kita lihat perbedaannya dengan 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");
}
}
Coba tebak apa yang akan dicetak ini ...
async: Memulai
async: Menjalankan
sinkronisasi 0,0070048 detik : Memulai
async: Menjalankan selama 5,0119008 detik
async: Selesai
sinkronisasi: Menjalankan untuk
sinkronisasi 5,2020168 detik : Selesai
Juga, menarik untuk diperhatikan bahwa Thread.Sleepjauh lebih akurat, akurasi ms tidak benar-benar masalah, sementara Task.Delaydapat mengambil minimal 15-30ms. Overhead pada kedua fungsi minimal dibandingkan dengan akurasi ms yang dimilikinya (gunakan StopwatchKelas jika Anda membutuhkan sesuatu yang lebih akurat).Thread.Sleepmasih mengikat Thread Anda, Task.Delaylepaskan untuk melakukan pekerjaan lain saat Anda menunggu.