¿Cómo obtener Thread.Sleep espera?

139

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

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 espera / asíncrono, bloquea toda la actividad en el hilo de la persona que llama.

¿Con qué debería 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
fuente

Respuestas:

323

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

En su lugar, debe usar el Task.Delayque no requiere un nuevo hilo, y 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);
Jon Skeet
fuente
Todavía me estoy familiarizando con el material a4.5. ¿Dónde está la rama de ejecución en el código después de esa declaración? ¿La parte que no duerme / bloquea la ejecuta o el 'hilo' que espera? ¿La ejecución principal sin bloqueo simplemente deja el bloque siguiente (también conocido como return)?
kenny
1
Si. Esto es EXACTAMENTE lo que necesito
Arsen Zahray
1
@kenny: Puede que mi asyncintroducción sea útil. Cuando el awaitable devuelto por Task.Delayse awaitcado, ya que no es completa, el método actual vuelve una tarea incompleta. Más tarde, cuando se Delaycompleta (apagado un temporizador, no un hilo), el resto del método está programado para ejecutarse. La continuación se ejecuta en un "contexto" que puede volver al mismo hilo original: detalles en mi blog.
Stephen Cleary
@StephenCleary gracias por eso. Entonces, ¿tengo razón al decir que el código después de esperar está 'programado' para su ejecución y el hilo de llamada vuelve?
kenny
2
Sí, el subproceso de llamada vuelve (inmediatamente) y el código después del awaitprogramado (eventualmente).
Stephen Cleary