2012-09-28 10 views
92

Thread.Sleep non sembra essere supportato in .NET per le app di Windows Store.Thread.Sleep sostituzione in .NET per Windows Store

Ad esempio, questo

  System.Threading.Thread.Sleep(1000); 

compilerà quando il targeting qualsiasi .NET Framework (2.0, 3.5, 4.0, 4.5), ma non quando il targeting .NET per le applicazioni Windows Store (o in una libreria di classi portatile che mira sia a 4.5 che a negozio).

System.Threading.Thread è ancora lì, non ha il metodo Sleep.

Devo ritardare qualcosa per alcuni secondi nella mia app, c'è un sostituto adatto?

MODIFICA perché il ritardo è necessario: la mia app è un gioco e il ritardo è far sembrare che l'avversario del computer stia "pensando" alla sua prossima mossa. Il metodo è già chiamato in modo asincrono (il thread principale non è bloccato), voglio solo rallentare i tempi di risposta.

+2

Considerando che le app di Windows Store non dovrebbero essere in grado di bloccare l'interfaccia utente (tutto dovrebbe essere asincrono), ha senso che non sia supportato. – Sruly

+2

Avete eventi o la classe 'Monitor'? È possibile utilizzare il metodo 'Wait' con un timeout per simulare un sonno. – Tudor

+0

è questo per Apptivate.ms? : 3 – EaterOfCode

risposta

188

Le app di Windows Store abbracciano l'asincronia e una "pausa asincrona" viene fornita da . Quindi, all'interno di un metodo asincrono, dovresti scrivere:

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

... o qualsiasi ritardo tu voglia. Il metodo asincrono continuerà 30 secondi dopo, ma il thread sarà non essere bloccato, proprio come per tutte le espressioni await.

+0

Questo funziona per .NET per Windows Store, quindi hai risposto alla mia domanda. Grazie! – Max

+1

Sfortunatamente, Task.Delay non sembra essere supportato durante il targeting di .NET 4.5 + store + WP7 in una libreria di classi portatile. Credo che avrò spostato questo nelle classi specifiche della piattaforma. – Max

+1

@Max: No, perché non esisteva prima di .NET 4.5. IIRC, WP7 stesso non ha alcun supporto TPL. (Potrei sbagliarmi ...) –

-7

Non c'è quasi alcun motivo (tranne che per scopi di test) per MAI utilizzare Thread.Sleep().

SE (e solo se) si dispone di un buon motivo per inviare una discussione in stop, è possibile controllare lo Task.Delay(), che è possibile attendere per "attendere" per un periodo di tempo specificato. Anche se non è mai una buona idea avere un thread in giro e non fare nulla. Cattiva pratica ...

+9

Non sono d'accordo. Se il thread è un thread in background e il sleep è breve, è più efficiente farlo dormire per alcuni millisecondi rispetto all'utilizzo di un timer. –

+1

e talvolta ti viene detto di farlo nonostante consulti la figura dell'autorità delle conseguenze;) – 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: basta modificarlo! :) – Ashe

18

Ho appena avuto lo stesso problema e ha trovato un'altra soluzione interessante che ho voluto condividere con voi. Se davvero si vuole bloccare il thread lo farei così (grazie per il suggerimento @Brannon "slim"):

// `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

Questa è la migliore risposta per la codifica portatile. – zezba9000

+0

Questo ha funzionato meglio per me. –

+0

Usa la versione "slim" di questo. – Brannon

41

odio per affermare l'ovvio, ma nel caso in cui qualcuno voleva una singola linea System.Threading.Tasks.Task.Delay(3000).Wait()