La mayor diferencia entre Task.Delay
y Thread.Sleep
es que Task.Delay
está destinado a ejecutarse de forma asincrónica. No tiene sentido usarlo Task.Delay
en código síncrono. Es una idea MUY mala usar Thread.Sleep
en código asincrónico.
Normalmente llamarás Task.Delay()
con la await
palabra 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 delay
anterior 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.Sleep
es mucho más preciso, la precisión de ms no es realmente un problema, mientras que Task.Delay
puede 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 Stopwatch
Class si necesita algo más preciso). Thread.Sleep
aún ata tu hilo, Task.Delay
suéltalo para hacer otro trabajo mientras esperas.