A maior diferença entre Task.Delaye Thread.Sleepé a Task.Delayintenção de executar de forma assíncrona. Não faz sentido usar Task.Delayno código síncrono. É uma péssima idéia usar Thread.Sleepno código assíncrono.
Normalmente você ligará Task.Delay() com a awaitpalavra-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 delayacima 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.Delaypode 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 StopwatchClasse se precisar de algo mais preciso). Thread.Sleepainda amarra seu thread, Task.Delaysolte-o para fazer outro trabalho enquanto espera.