La mayor diferencia entre Task.Delayy Thread.Sleepes que Task.Delayestá destinado a ejecutarse de forma asincrónica. No tiene sentido usarlo Task.Delayen código síncrono. Es una idea MUY mala usar Thread.Sleepen código asincrónico.
Normalmente llamarás Task.Delay() con la awaitpalabra clave:
await Task.Delay(5000);
o, si desea ejecutar algún código antes del retraso:
var sw = new Stopwatch();
sw.Start();
Task delay = Task.Delay(5000);
Console.WriteLine("async: Running for {0} seconds", sw.Elapsed.TotalSeconds);
await delay;
¿Adivina qué imprimirá esto? Corriendo por 0.0070048 segundos. Si movemos lo await delayanterior Console.WriteLine, se imprimirá Running durante 5.0020168 segundos.
Veamos la diferencia 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");
}
}
Intenta predecir lo que esto imprimirá ...
asíncrono: inicio
asíncrono: ejecución de 0.0070048 segundos
sincronización: inicio
asíncrono: ejecución de 5.0119008 segundos
asíncrono: finalización de
sincronización: ejecución de 5.0020168 segundos
sincronización: finalizado
Además, es interesante notar que Thread.Sleepes mucho más preciso, la precisión de ms no es realmente un problema, mientras que Task.Delaypuede tomar un mínimo de 15-30 ms. La sobrecarga en ambas funciones es mínima en comparación con la precisión de ms que tienen (use StopwatchClass si necesita algo más preciso). Thread.Sleepaún ata tu hilo, Task.Delaysuéltalo para hacer otro trabajo mientras esperas.