¿Cómo conseguir Thread.Sleep esperado?

Resuelto Arsen Zahray asked hace 12 años • 1 respuestas

Estoy escribiendo una aplicación vinculada a la red basada en el paradigma de espera/suspensión.

A veces, ocurren errores de conexión y, en mi experiencia, vale la pena esperar un tiempo y luego volver a intentar la operación.

El problema es que si uso Thread.Sleep u otra operación de bloqueo similar en await/async, bloquea toda la actividad en el hilo de la persona que llama.

¿Con qué debo reemplazar Thread.Sleep(10000) para lograr el mismo efecto que?

await Thread.SleepAsync(10000)

?

ACTUALIZAR

Preferiré una respuesta que haga esto sin crear ningún hilo adicional.

Arsen Zahray avatar Nov 17 '12 17:11 Arsen Zahray
Aceptado

Las otras respuestas que sugieren iniciar un nuevo hilo son una mala idea; no es necesario hacerlo en absoluto. Parte del objetivo de async/ awaites reducir la cantidad de subprocesos que necesita su aplicación.

En su lugar, deberías usar Task.Delayel que no requiere un hilo nuevo y que fue diseñado precisamente para este propósito:

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

Esta solución también tiene la ventaja de permitir la cancelación , si se proporciona un token de cancelación. Ejemplo:

public async Task DoWork(CancellationToken token)
{
    await Task.Delay(1000, token);
}
Jon Skeet avatar Nov 17 '2012 11:11 Jon Skeet