Reemplazo de Thread.Sleep en .NET para la Tienda Windows

98

Thread.Sleep no parece ser compatible con .NET para las aplicaciones de la Tienda Windows.

Por ejemplo, este

System.Threading.Thread.Sleep(1000);

se compilará cuando se dirija a cualquier .NET Framework (2.0, 3.5, 4.0, 4.5), pero no cuando se oriente a .NET para aplicaciones de la Tienda Windows (o en una biblioteca de clases portátil que tenga como destino 4.5 y tienda).

System.Threading.Thread sigue ahí, simplemente no tiene el método Sleep.

Necesito retrasar algo durante unos segundos en mi aplicación, ¿hay un reemplazo adecuado?

EDITAR por qué es necesario el retraso: Mi aplicación es un juego y el retraso es para que parezca que el oponente de la computadora está "pensando" en su próximo movimiento. El método ya se llama asincrónicamente (el hilo principal no está bloqueado), solo quiero ralentizar el tiempo de respuesta.

Max
fuente
2
Teniendo en cuenta que se supone que las aplicaciones de la Tienda Windows no pueden congelar la interfaz de usuario (se supone que todo es asíncrono), tiene sentido que no sea compatible.
Julio
2
¿Tienen eventos o la Monitorclase? Puede utilizar el Waitmétodo con un tiempo de espera para simular un sueño.
Tudor
¿Esto es para Apptivate.ms? : 3
EaterOfCode
3
Yay por desterrar Thread.Sleepal basurero de la mala tecnología.
gastador

Respuestas:

203

Las aplicaciones de la Tienda Windows adoptan la asincronía, y proporciona una "pausa asincrónica" Task.Delay. Entonces, dentro de un método asincrónico, escribirías:

await Task.Delay(TimeSpan.FromSeconds(30));

... o el retraso que quieras. El método asincrónico continuará 30 segundos después, pero el hilo no se bloqueará, como ocurre con todas las awaitexpresiones.

Jon Skeet
fuente
1
Desafortunadamente, Task.Delay no parece ser compatible cuando se apunta a .NET 4.5 + store + WP7 en una biblioteca de clases portátil. Supongo que tendré que mover esto a las clases específicas de la plataforma.
Máx.
1
@Max: No, porque no existía antes de .NET 4.5. IIRC, WP7 en sí no tiene ningún soporte TPL. (Podría estar equivocado ...)
Jon Skeet
4
Puede agregarlo .RunSynchronously()si es necesario.
HappyNomad
1
@RAM: Bueno, Thread.Sleep es compatible con .NET 3.5, por lo que la pregunta no se aplica. Sin duda tienes una pregunta, pero no parece que sea lo mismo que esta. Lea tinyurl.com/stack-hints y luego haga una nueva pregunta.
Jon Skeet
2
@RAM: No estoy seguro de cómo se suponía que debía adivinar eso por sus comentarios. Ya hay muchas preguntas similares en SO sobre WPF y animación.
Jon Skeet
46

Odio decir lo obvio, pero en caso de que alguien quisiera una sola línea System.Threading.Tasks.Task.Delay(3000).Wait()

Antony Thomas
fuente
20

Simplemente tuve el mismo problema y encontré otra solución interesante que quería compartir con ustedes. Si realmente quieres bloquear el hilo, lo haría así (gracias @Brannon por la sugerencia "delgada"):

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}
Johannes Egger
fuente
Esta es la mejor respuesta para la codificación portátil.
zezba9000
Utilice la versión "delgada" de esto.
Brannon
11

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}
Benny Neugebauer
fuente
-7

Casi NINGUNA razón (excepto con fines de prueba) para el uso NUNCA Thread.Sleep().

SI (y solo si) tiene una muy buena razón para enviar un hilo a dormir, es posible que desee verificar Task.Delay(), que puede esperar para "esperar" durante un tiempo específico. Aunque nunca es una buena idea tener un hilo suelto y no hacer nada. Mala práctica ...

igrimpe
fuente
9
Estoy en desacuerdo. Si el subproceso es un subproceso en segundo plano y la suspensión es corta, entonces es más eficiente tenerla en reposo durante unos milisegundos que usar un temporizador.
Jason Steele
1
y a veces te dicen que lo hagas a pesar de avisar a dicha figura de autoridad de las consecuencias;)
Jordan