Nuestros desarrolladores estrellas han agotado sus provisiones de café, por su búsqueda todo el tiempo por la resolución, hasta que Marco encontró el hallazgo en Gitea por lo tanto ahora la comparte contigo.
Solución:
Usar Thread.Sleep
cuando quieras bloquear el hilo actual.
Usar Task.Delay
cuando desea un retraso lógico sin bloquear el hilo actual.
La eficiencia no debe ser una preocupación primordial con estos métodos. Su principal uso en el mundo real es como temporizadores de reintento para operaciones de E/S, que son del orden de segundos en lugar de milisegundos.
La mayor diferencia entre Task.Delay
y Thread.Sleep
es eso Task.Delay
está diseñado para ejecutarse de forma asíncrona. No tiene sentido usar Task.Delay
en código síncrono. Es una MUY mala idea usar Thread.Sleep
en código asíncrono.
Normalmente llamarás Task.Delay()
con el 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 el await delay
sobre el Console.WriteLine
en su lugar, 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");
Trate de predecir lo que esto imprimirá…
asíncrono: Iniciando
asíncrono: funcionando durante 0,0070048 segundos
sincronizar: Iniciando
asíncrono: funcionando durante 5,0119008 segundos
asíncrono: Listo
sincronización: Corriendo por 5.0020168 segundos
sincronizar: Listo
Además, es interesante notar que Thread.Sleep
es mucho más precisa, la precisión de ms no es realmente un problema, mientras que Task.Delay
puede tomar 15-30ms mínimo. La sobrecarga en ambas funciones es mínima en comparación con la precisión de ms que tienen (utilice Stopwatch
Clase si necesita algo más preciso). Thread.Sleep
todavía ata tu Hilo, Task.Delay
suéltelo para hacer otro trabajo mientras espera.
si el hilo actual se mata y usas Thread.Sleep
y se está ejecutando, entonces podría obtener un ThreadAbortException
. Con Task.Delay
siempre puede proporcionar un token de cancelación y matarlo con gracia. Esa es una razón por la que elegiría Task.Delay
. consulte http://social.technet.microsoft.com/wiki/contents/articles/21177.visual-c-thread-sleep-vs-task-delay.aspx
También estoy de acuerdo en que la eficiencia no es primordial en este caso.
Más adelante puedes encontrar las anotaciones de otros creadores, tú también tienes el poder dejar el tuyo si te apetece.