c# - sirve - Reemplazo Thread.Sleep en.NET para Windows Store
timer sleep c# (5)
Thread.Sleep no parece ser compatible con .NET para las aplicaciones de Windows Store.
Por ejemplo, esto
System.Threading.Thread.Sleep(1000);
compilará cuando se dirija a .NET Framework (2.0, 3.5, 4.0, 4.5), pero no cuando se dirija a las aplicaciones .NET para Windows Store (o en una biblioteca de clases portátil que se dirija a 4.5 y tienda).
System.Threading.Thread todavía está allí, simplemente no tiene el método Sleep.
Necesito retrasar algo durante unos segundos en mi aplicación, ¿hay un reemplazo adecuado?
EDITA por qué es necesaria la demora: mi aplicación es un juego y la demora es para hacer que parezca que el oponente de la computadora está "pensando" en su próximo movimiento. El método ya se llama de forma asíncrona (el hilo principal no está bloqueado), solo quiero reducir la velocidad del tiempo de respuesta.
Casi NINGUNA razón (excepto para fines de prueba) NUNCA usa Thread.Sleep()
.
SI (y solo si) tiene una muy buena razón para enviar un hilo a dormir, es posible que desee comprobar Task.Delay()
, que puede esperar para "esperar" durante un tiempo específico. Aunque nunca es una buena idea tener un hilo sentado y no hacer nada. Mala práctica ...
Las aplicaciones de Windows Store incluyen asincronía, y Task.Delay
proporciona una "pausa asíncrona". Entonces, dentro de un método asincrónico, escribirías:
await Task.Delay(TimeSpan.FromSeconds(30));
... o cualquier demora que quieras. El método asíncrono continuará 30 segundos más tarde, pero el hilo no se bloqueará, al igual que para todas las expresiones en await
.
Odio decir lo obvio, pero en caso de que alguien quisiera una sola línea System.Threading.Tasks.Task.Delay(3000).Wait()
Simplemente tuve el mismo problema y encontré otra solución interesante que quería compartir contigo. Si realmente quieres bloquear el hilo, lo haría así (gracias @Brannon por la pista "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));
}
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!
}