La differenza più grande tra Task.Delaye Thread.Sleepè che Task.Delaysi intende eseguire in modo asincrono. Non ha senso utilizzare Task.Delaynel codice sincrono. È un'idea MOLTO negativa da utilizzare Thread.Sleepnel codice asincrono.
Normalmente chiamerai Task.Delay() con la awaitparola 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 delaysopra 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.Delaypuò richiedere un minimo di 15-30ms. Il sovraccarico su entrambe le funzioni è minimo rispetto alla precisione in ms che hanno (usa StopwatchClass se hai bisogno di qualcosa di più accurato). Thread.Sleeplega ancora il tuo thread, Task.Delayrilascialo per fare altri lavori mentre aspetti.