Saltar al contenido

¿Cuándo usar Task.Delay, cuándo usar Thread.Sleep?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *