2012-09-28 24 views
92

Thread.Sleep no parece ser compatible con .NET para Windows Store.Thread.Sleep replacement en .NET para Windows Store

Por ejemplo, este

  System.Threading.Thread.Sleep(1000); 

compilará cuando la orientación de cualquier .NET Framework (2.0, 3.5, 4.0, 4.5), pero no cuando la orientación de NET para aplicaciones de Windows Store (o en una biblioteca de clases portátil que apunta tanto a 4.5 como a la 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 necesaria la demora: Mi aplicación es un juego y la demora consiste en 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.

+2

Teniendo en cuenta que las aplicaciones de la Tienda Windows no deben poder congelar la UI (se supone que todo es una sincronización), tiene sentido que no sea compatible. – Sruly

+2

¿Tiene eventos o la clase 'Monitor'? Puede usar el método 'Wait' con un tiempo de espera para simular un sueño. – Tudor

+0

es esto para Apptivate.ms? : 3 – EaterOfCode

Respuesta

188

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

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

... o el retraso que desee. El método asíncrono continuará 30 segundos más tarde, pero el subproceso se no se bloqueará, al igual que para todas las expresiones await.

+0

Eso funciona para .NET para Windows Store, por lo que respondió mi pregunta. ¡Gracias! – Max

+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. – Max

+1

@Max: no, porque no existía antes de .NET 4.5. IIRC, WP7 en sí mismo no tiene ningún soporte TPL. (Podría estar equivocado ...) –

-7

Casi NINGUNA razón (excepto para propósitos de prueba) NUNCA use 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 a "esperar" durante un tiempo especificado. Aunque nunca es una buena idea tener un hilo sentado y no hacer nada. Mala práctica ...

+9

No estoy de acuerdo. Si el hilo es un hilo de fondo y el tiempo de sueño es corto, es más eficiente que duerma durante unos pocos milisegundos que utilizando un temporizador. –

+1

y, a veces, se le dice que lo haga a pesar de informar a dicha autoridad de las consecuencias;) – Jordan

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! 
} 
+0

MainPage.xaml.cs –

+1

@ Zéiksz: ¡solo edítalo! :) – Ashe

18

sólo tenía el mismo problema y encontré otra solución interesante que quería compartir con ustedes. Si realmente quiere bloquear el hilo que lo haría así (gracias @Brannon por la pista "delgado"):

// `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)); 
} 
+0

Esta es la mejor respuesta para la codificación portátil. – zezba9000

+0

Esto funcionó mejor para mí. –

+0

Usa la versión "delgada" de esto. – Brannon

41

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

Cuestiones relacionadas