2014-05-12 8 views
10

Sto cercando di utilizzare questi due metodi (di WP 8) in Windows Phone 8.1, ma dà errore e non viene compilato, molto probabilmente perché vengono rimossi. Ho provato a cercare le nuove API ma non ho potuto ottenerne. Quali sono altre alternative per questi.nuove API per Windows Phone 8.1

Dispatcher.BeginInvoke(() => {});msdn link

System.Threading.Thread.Sleep();msdn link

risposta

14

Esiste ancora per le app SIlverlight di Windows Phone 8.1, ma non per le app di Windows Phone Store. Le sostituzioni per Windows Store Apps è:

sonno (vedi Thread.Sleep replacement in .NET for Windows Store):

await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30)); 

Dispatcher (vedi How the Deployment.Current.Dispatcher.BeginInvoke work in windows store app?):

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => { }); 
9

Dispatcher.BeginInvoke(() => {}); è sostituito dal

await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => {}); 

e System.Threading.Thread.Sleep(); è sostituito da

await Task.Delay(TimeSpan.FromSeconds(doubleValue)); 
+0

grazie, funziona – IloveIniesta

1

Per Dispatcher, provare questo. MSDN

private async Task MyMethod() 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { }); 
} 

Per Thread.Sleep() provare await Task.Delay(1000). MSDN

6

Si noti che non solo è stata modificata l'API (adottando l'API dalle app di WindowsStore), ma anche il modo in cui è stato ottenuto il Dispatcher in WindowsPhone 8.0 è cambiato.

@Johan Il suggerimento di Faulk, sebbene funzionerà, può restituire nulla in una moltitudine di condizioni.

Vecchio codice per afferrare il dispatcher:

var dispatcher = Deployment.Current.Dispatcher; 
or 
Deployment.Current.Dispatcher.BeginInvoke(()=>{ 
    // any code to modify UI or UI bound elements goes here 
}); 

nuovo in Windows 8.1 distribuzione non è un oggetto o di spazio dei nomi disponibili.

Al fine di assicurarsi che si ottiene il dispatcher thread principale dell'interfaccia utente, utilizzare il seguente:

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher; 
or 
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
    CoreDispatcherPriority.Normal, 
()=>{ 
     // UI code goes here 
}); 

Inoltre, anche se il metodo dice che sarà eseguito Async la parola attendono non possono essere utilizzati nel metodo invocato da RunAsync. (nell'esempio precedente il metodo è anonimo).

Per eseguire un metodo attendibile all'interno del metodo anonimo sopra, decorare il metodo anonimo all'interno di RunAsync() con la parola chiave async.

CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal, 
**async**()=>{ 
     // UI code goes here 
     var response = **await** LongRunningMethodAsync(); 
}); 
+0

È cambiato tutto di nuovo da questo post o mi manca qualcosa?Il posizionamento dei risultati attende in un errore di sintassi, così come il mio codice quando mi sposto "attende" da prima di Dispatcher prima del metodo anonimo. private async void PlayLaser() {DIspatcher.RunAsync (Windows.UI.Core.CoreDispatcherPriority.Normal, await() => {laser.Play();}); } (Stavo cercando di non attendere affatto ma il mio audio è a volte troppo ritardato.) – sraboy

+0

Si prega di essere più specifici, Windows 8.1 non è cambiato da questo post. Per quanto riguarda Windows 10, questo potrebbe non essere il thread appropriato in quanto è contrassegnato da WindowsPhone 8.1. Molte delle API sono completamente cambiate su WindowsPhone 10 per unificare i sistemi operativi. –

+0

Sono su Windows 10 ma sto costruendo un'applicazione universale per 8.1 e Phone 8.1 con VS2015. Non è Win10 Universal. – sraboy