La differenza più grande tra Task.Delay
e Thread.Sleep
è che Task.Delay
si intende eseguire in modo asincrono. Non ha senso utilizzare Task.Delay
nel codice sincrono. È un'idea MOLTO negativa da utilizzare Thread.Sleep
nel codice asincrono.
Normalmente chiamerai Task.Delay()
con la await
parola chiave:
await Task.Delay(5000);
oppure, se si desidera eseguire un codice prima del ritardo:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Indovina cosa verrà stampato? In esecuzione per 0,0070048 secondi. Se invece spostiamo quanto await delay
sopra Console.WriteLine
, verrà stampato In esecuzione per 5.0020168 secondi.
Diamo un'occhiata alla differenza con 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");
}
}
Prova a prevedere cosa verrà stampato ...
asincrono: avvio
asincrono: in esecuzione per 0,0070048 secondi
sincronizzazione: avvio
asincrono: in esecuzione per 5,0119008 secondi
asincrono:
sincronizzazione completata: in esecuzione per
sincronizzazione 5,000068 secondi : Fine
Inoltre, è interessante notare che Thread.Sleep
è molto più preciso, l'accuratezza ms non è davvero un problema, mentre Task.Delay
può richiedere un minimo di 15-30ms. Il sovraccarico su entrambe le funzioni è minimo rispetto alla precisione in ms che hanno (usa Stopwatch
Class se hai bisogno di qualcosa di più accurato). Thread.Sleep
lega ancora il tuo thread, Task.Delay
rilascialo per fare altri lavori mentre aspetti.