Perbedaan terbesar antara Task.Delay
dan Thread.Sleep
adalah yang Task.Delay
dimaksudkan untuk berjalan secara tidak sinkron. Tidak masuk akal untuk menggunakan Task.Delay
kode sinkron. Ini adalah ide yang SANGAT buruk untuk digunakan Thread.Sleep
dalam kode asinkron.
Biasanya Anda akan menelepon Task.Delay()
dengan await
kata 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 delay
atas 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.Sleep
jauh lebih akurat, akurasi ms tidak benar-benar masalah, sementara Task.Delay
dapat mengambil minimal 15-30ms. Overhead pada kedua fungsi minimal dibandingkan dengan akurasi ms yang dimilikinya (gunakan Stopwatch
Kelas jika Anda membutuhkan sesuatu yang lebih akurat).Thread.Sleep
masih mengikat Thread Anda, Task.Delay
lepaskan untuk melakukan pekerjaan lain saat Anda menunggu.