Arasındaki en büyük fark Task.Delay
ve Thread.Sleep
yani Task.Delay
uyumsuz çalıştırmak için tasarlanmıştır. Task.Delay
Eşzamanlı kodda kullanmak mantıklı değildir . Thread.Sleep
Eşzamansız kodda kullanmak ÇOK kötü bir fikirdir .
Normalde Task.Delay()
şu await
anahtar kelime ile arayacaksınız :
await Task.Delay(5000);
veya gecikmeden önce bir kod çalıştırmak isterseniz:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Bil bakalım bu ne yazdıracak? 0.0070048 saniye çalışıyor. Bunun yerine await delay
yukarı hareket edersek Console.WriteLine
, 5.0020168 saniye boyunca Çalışıyor yazdıracaktır.
Aradaki farka bakalım 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");
}
}
Bunun ne yazdıracağını tahmin etmeye çalışın ...
eşzamansız:
Eşzamansız çalıştırma: 0,0070048 saniye
senkronizasyon için çalışıyor: Eşzamansız başlatma
: 5,0119008 saniye çalışır
Async: Bitti
senkronizasyon: 5,0020168 saniye
senkronizasyon için çalışıyor : Bitti
Ayrıca, Thread.Sleep
çok daha doğru olduğunu fark etmek ilginçtir , ms doğruluğu gerçekten bir sorun değildir, Task.Delay
minimum 15-30ms sürebilir. Her iki fonksiyondaki ek yük, sahip oldukları ms doğruluğuna kıyasla minimumdur ( Stopwatch
daha doğru bir şeye ihtiyacınız varsa Class'ı kullanın ). Thread.Sleep
Hala İpliğinizi bağlar, Task.Delay
beklerken başka işler yapmak için serbest bırakın.