它们仍然适用于Windows Phone 8.1 Silverlight应用程序,但不适用于Windows Phone商店应用程序。 Windows Store应用程序的替代方案是:
Sleep(请参见 .NET中用于Windows Store的Thread.Sleep替代方法):
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30));
调度程序(请参见如何在 Windows Store 应用中工作的 Deployment.Current.Dispatcher.BeginInvoke?):
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的新特性“Deployment”不是可用的对象或命名空间。
为了确保获取主UI线程分派程序,请使用以下代码:
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
or
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
()=>{
// UI code goes here
});
此外,虽然该方法声称它将异步执行,但在由RunAsync调用的方法中无法使用关键字await。(在上面的示例中,该方法是匿名的)。
为了在上述匿名方法中执行可等待方法,请使用async关键字装饰RunAsync()内部的匿名方法。
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
**async**()=>{
// UI code goes here
var response = **await** LongRunningMethodAsync();
});