2014-05-12 171 views
10

我想在Windows Phone 8.1中使用這兩種方法(但WP 8),但它會給出錯誤,並且不會編譯,最可能的原因是它們被刪除。我試圖搜索新的API,但沒有得到任何。這些有什麼其他的選擇。新的Windows Phone 8.1的API

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

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

回答

14

取代它們仍然適用於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,() => { }); 
9

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

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

System.Threading.Thread.Sleep();代替由

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

謝謝,它的工作 – IloveIniesta

1

分派器,試試這個。 MSDN

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

對於Thread.Sleep()嘗試await Task.Delay(1000)MSDN

6

請注意,不僅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(); 
}); 
+0

自從這篇文章後,一切都改變了,或者我錯過了什麼?當我將Dispatcher之前的「await」移動到匿名方法之前時,您的await放置會導致語法錯誤,就像我自己的代碼一樣。 private async void PlayLaser(){DIspatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,await()=> {laser.Play();}); } (我一直試圖不等待,但是我的音頻有時候太晚了。) – sraboy

+0

請更具體一點,Windows 8.1從這篇文章開始就沒有改變。至於Windows 10,這可能不是合適的線程,因爲它被標記爲WindowsPhone 8.1。 WindowsPhone 10中的許多API已經完全改變,以統一操作系統。 –

+0

我在Windows 10上,但用VS2015構建了8.1和Phone 8.1的通用應用程序。這不是Win10 Universal。 – sraboy