Der größte Unterschied zwischen Task.Delay
und Thread.Sleep
besteht darin, dass Task.Delay
dazu gedacht ist, asynchron ausgeführt zu werden. Es macht keinen Sinn, Task.Delay
im synchronen Code zu verwenden. Es ist eine SEHR schlechte Idee, Thread.Sleep
im asynchronen Code zu verwenden.
Normalerweise ruft man Task.Delay()
mit dem await
Schlüsselwort auf:
await Task.Delay(5000);
Oder, wenn du etwas Code vor der Verzögerung ausführen möchtest:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Läuft für {0} Sekunden", sw.Elapsed.TotalSeconds);
await delay;
Vermutest du, was das drucken wird? Läuft für 0,0070048 Sekunden. Wenn wir das await delay
über das Console.WriteLine
verschieben, wird es Läuft für 5,0020168 Sekunden drucken.
Schauen wir uns den Unterschied mit Thread.Sleep
an:
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: Starten");
Task delay = Task.Delay(5000);
Console.WriteLine("async: Läuft für {0} Sekunden", sw.Elapsed.TotalSeconds);
await delay;
Console.WriteLine("async: Läuft für {0} Sekunden", sw.Elapsed.TotalSeconds);
Console.WriteLine("async: Fertig");
}
static void syncCode()
{
var sw = new Stopwatch();
sw.Start();
Console.WriteLine("sync: Starten");
Thread.Sleep(5000);
Console.WriteLine("sync: Läuft für {0} Sekunden", sw.Elapsed.TotalSeconds);
Console.WriteLine("sync: Fertig");
}
}
Versuche vorherzusagen, was das drucken wird...
async: Starten
async: Läuft für 0,0070048 Sekunden
sync: Starten
async: Läuft für 5,0119008 Sekunden
async: Fertig
sync: Läuft für 5,0020168 Sekunden
sync: Fertig
Interessant ist auch zu bemerken, dass Thread.Sleep
viel genauer ist, die Millisekunden-Genauigkeit ist kein wirkliches Problem, während Task.Delay
mindestens 15-30ms dauern kann. Der Overhead bei beiden Funktionen ist minimal im Vergleich zur Millisekunden-Genauigkeit (verwende die Stopwatch
Klasse, wenn du etwas genaueres benötigst). Thread.Sleep
blockiert immer noch deinen Thread, während Task.Delay
ihn freigibt, um andere Arbeiten zu erledigen, während du wartest.