我想在Windows Phone 8.1中使用這兩種方法(但WP 8),但它會給出錯誤,並且不會編譯,最可能的原因是它們被刪除。我試圖搜索新的API,但沒有得到任何。這些有什麼其他的選擇。新的Windows Phone 8.1的API
Dispatcher.BeginInvoke(() => {});
msdn link
System.Threading.Thread.Sleep();
msdn link
我想在Windows Phone 8.1中使用這兩種方法(但WP 8),但它會給出錯誤,並且不會編譯,最可能的原因是它們被刪除。我試圖搜索新的API,但沒有得到任何。這些有什麼其他的選擇。新的Windows Phone 8.1的API
Dispatcher.BeginInvoke(() => {});
msdn link
System.Threading.Thread.Sleep();
msdn link
取代它們仍然適用於Windows Phone 8.1 SIlverlight應用程序,但不適用於Windows Phone Store應用程序。對於Windows商店應用程式的替代品是:
睡眠(見Thread.Sleep replacement in .NET for Windows Store):
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30));
調度程序(見How the Deployment.Current.Dispatcher.BeginInvoke work in windows store app?):
CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => { });
Dispatcher.BeginInvoke(() => {});
由
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => {});
和System.Threading.Thread.Sleep();
代替由
await Task.Delay(TimeSpan.FromSeconds(doubleValue));
請注意,不僅API已更改(採用WindowsStore應用程序中的API),而且在WindowsPhone 8.0中獲得Dispatcher的方式也發生了變化。
@Johan Faulk的建議雖然可行,但可能會在多種條件下返回null。
老代碼獲取調度員:
var dispatcher = Deployment.Current.Dispatcher;
or
Deployment.Current.Dispatcher.BeginInvoke(()=>{
// any code to modify UI or UI bound elements goes here
});
新在Windows 8.1部署不是一個可用的對象或命名空間。
爲了確保獲得在主UI線程調度,使用以下:
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
or
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
()=>{
// UI code goes here
});
另外,雖然該方法表示,將異步的關鍵字來執行伺機不能在調用的方法使用由RunAsync。 (在上例中該方法是匿名的)。
爲了在上面的匿名方法中執行awaitable方法,請使用async關鍵字修飾RunAsync()中的匿名方法。
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
**async**()=>{
// UI code goes here
var response = **await** LongRunningMethodAsync();
});
自從這篇文章後,一切都改變了,或者我錯過了什麼?當我將Dispatcher之前的「await」移動到匿名方法之前時,您的await放置會導致語法錯誤,就像我自己的代碼一樣。 private async void PlayLaser(){DIspatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,await()=> {laser.Play();}); } (我一直試圖不等待,但是我的音頻有時候太晚了。) – sraboy
請更具體一點,Windows 8.1從這篇文章開始就沒有改變。至於Windows 10,這可能不是合適的線程,因爲它被標記爲WindowsPhone 8.1。 WindowsPhone 10中的許多API已經完全改變,以統一操作系統。 –
我在Windows 10上,但用VS2015構建了8.1和Phone 8.1的通用應用程序。這不是Win10 Universal。 – sraboy
謝謝,它的工作 – IloveIniesta