Der größte Unterschied zwischen Task.Delay
und Thread.Sleep
besteht darin, dass Task.Delay
asynchron ausgeführt werden soll. Die Verwendung Task.Delay
in synchronem Code ist nicht sinnvoll . Es ist eine sehr schlechte Idee, Thread.Sleep
in asynchronem Code zu verwenden.
Normalerweise rufen Sie Task.Delay()
mit dem await
Schlüsselwort an:
await Task.Delay(5000);
oder, wenn Sie vor der Verzögerung Code ausführen möchten:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Ratet mal, was dies drucken wird? Läuft für 0,0070048 Sekunden. Wenn wir stattdessen das await delay
Obige verschieben Console.WriteLine
, wird Running für 5.0020168 Sekunden gedruckt.
Schauen wir uns den Unterschied an mit 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");
}
}
Versuchen Sie vorherzusagen, was dies drucken wird ...
async:
Async starten: 0,0070048 Sekunden laufen lassen
Synchronisation: Async starten :
5,0119008 Sekunden laufen lassen
async:
Synchronisierung abgeschlossen: 5,0020168 Sekunden lang laufen
Synchronisation: Fertig
Es ist auch interessant festzustellen , dass die Thread.Sleep
Genauigkeit weitaus genauer ist, die Genauigkeit von ms kein wirkliches Problem darstellt und Task.Delay
minimal 15 bis 30 ms dauern kann. Der Overhead für beide Funktionen ist im Vergleich zu ihrer ms-Genauigkeit minimal (verwenden Sie Stopwatch
Class, wenn Sie etwas genaueres benötigen). Thread.Sleep
Bindet Ihren Thread immer noch zusammen und gibt Task.Delay
ihn frei, um andere Arbeiten auszuführen, während Sie warten.