A maior diferença entre Task.Delay
e Thread.Sleep
é a Task.Delay
intenção de executar de forma assíncrona. Não faz sentido usar Task.Delay
no código síncrono. É uma péssima idéia usar Thread.Sleep
no código assíncrono.
Normalmente você ligará Task.Delay()
com a await
palavra-chave:
await Task.Delay(5000);
ou, se você deseja executar algum código antes do atraso:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
Adivinha o que isso vai imprimir? Em execução por 0,0070048 segundos. Se movermos o await delay
acima Console.WriteLine
, em vez disso, ele imprimirá Running por 5.0020168 segundos.
Vejamos a diferença com 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");
}
}
Tente prever o que isso imprimirá ...
assíncrono: Iniciando
assíncrono: executando por 0,0070048 segundos de
sincronização: Iniciando
assíncrono: executando por 5,0119008 segundos
assíncrono: concluído
sincronizado: executando por 5,0020168 segundos
sincronizado: concluído
Além disso, é interessante notar que Thread.Sleep
é muito mais preciso, a precisão da ms não é realmente um problema, enquanto Task.Delay
pode demorar 15 a 30 ms no mínimo. A sobrecarga em ambas as funções é mínima em comparação com a precisão de ms que elas possuem (use Stopwatch
Classe se precisar de algo mais preciso). Thread.Sleep
ainda amarra seu thread, Task.Delay
solte-o para fazer outro trabalho enquanto espera.