Windows Phone 8.1的新API

11

我正在尝试在Windows Phone 8.1中使用这两种方法(来自WP 8),但是它们会引发错误并且无法编译,很可能是因为它们已被删除。我尝试搜索新的API,但没有找到。这些方法的其他替代方案是什么。

Dispatcher.BeginInvoke( () => {}); MSDN链接

System.Threading.Thread.Sleep(); MSDN链接

4个回答

14

它们仍然适用于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, () => { });

9

Dispatcher.BeginInvoke( () => {});被替换为

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

System.Threading.Thread.Sleep();则被替换为

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

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的新特性“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();
});

自从这篇文章发布后,一切都改变了吗?还是我漏掉了什么?将 await 放在 Dispatcher 之前会导致语法错误,当我将 "await" 移动到匿名方法之前时,我的代码也会出现同样的问题。private async void PlayLaser() { DIspatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, await () => { laser.Play(); }); }(我试图完全不等待,但我的音频有时太延迟了。) - sraboy
请具体说明,自这篇文章以来,Windows 8.1 没有改变。至于 Windows 10,这可能不是适当的主题,因为它被标记为 WindowsPhone 8.1。许多 API 在 WindowsPhone 10 上已完全更改,以统一操作系统。 - Zack Weiner
我正在使用Windows 10,但是使用VS2015构建8.1和Phone 8.1通用应用程序。它不是Win10 Universal。 - sraboy
1
请重新阅读我示例中的最后一个代码块以及上面的注释。你的“有问题的代码”将await放在了应该是async的位置,并且没有等待laser.play(),导致它被同步调用。这是因为你把await放在了匿名方法前面,这是不可能的。这应该可以帮助你:---- private async void PlayLaser() { Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { await laser.Play(); }); } - Zack Weiner
糟糕!但是Play()不能用于等待。我认为我已经使用Dispatcher.RunAsync()异步运行Play()了,不是吗?另外,在我的异步方法中,我仍然收到没有在Dispatcher.RunAsync()之前使用await的警告。哦,好吧,我想我有一些阅读要做。 - sraboy

1
对于 Dispatcher,尝试这个。MSDN
private async Task MyMethod()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { });
}

对于 Thread.Sleep(),请尝试使用 await Task.Delay(1000)MSDN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接