Arasındaki en büyük fark Task.Delayve Thread.Sleepyani Task.Delayuyumsuz çalıştırmak için tasarlanmıştır. Task.DelayEşzamanlı kodda kullanmak mantıklı değildir . Thread.SleepEşzamansız kodda kullanmak ÇOK kötü bir fikirdir .
Normalde Task.Delay() şu awaitanahtar 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 delayyukarı 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.Delayminimum 15-30ms sürebilir. Her iki fonksiyondaki ek yük, sahip oldukları ms doğruluğuna kıyasla minimumdur ( Stopwatchdaha doğru bir şeye ihtiyacınız varsa Class'ı kullanın ). Thread.SleepHala İpliğinizi bağlar, Task.Delaybeklerken başka işler yapmak için serbest bırakın.