我是Windows Phone Dev的新手,并且正在将WP8 SilverLight应用程序迁移到WP8.1 WinRT。以下是我在WP8的ViewModel上的工作代码,该代码不适用于Store应用程序。
该代码的逻辑是每秒钟更新一次UI线程上的Xaml txtBox值,这是在UpdateTicker()方法内部完成的。
WP8工作代码:
Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
{
UpdateTicker(); // this method gets called every second
}), null);
}
});
经过大量搜索之后,我找到了MSDN和SO,下面的代码对于wp8.1 winRT可以很好地编译,但是仍然无法正常工作-当放置断点时,调试器仅到达一次UpdateTicker()步骤,而
UpdateTicker
方法应该每秒调用一次(这是第一段代码发生的情况)WP8.1 WinRT代码:
Task.Run(async delegate
{
while (true)
{
await Task.Delay(1000);
CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
UpdateTicker(); // this method does not get called every second
});
}
});
对于从ViewModel一起使用wp8.1 env的异步任务和Dispatcher.BeginInvoke(或类似方法)的任何指导,均应赞赏。
最佳答案
实际上,我建议您避免使用Dispatcher
,CoreDispatcher
等。总会有更好的解决方案。
在这种情况下,您可以使用进度更新。以下是一些应在Windows Phone Silverlight 8以及Windows Phone Apps 8.1上运行的代码:
IProgress<object> progress = new Progress<object>(_ => UpdateTicker());
Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
progress.Report(null);
}
});
旁注:在生产代码中,您几乎从不希望仅启动
Task.Run
而不对返回的Task
进行任何操作。至少,您应该(异步地)有一些代码等待从循环中捕获任何异常。关于c# - 使用异步任务和分派(dispatch)器从ViewModel循环更新WP8.1 WinRT的UI线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25890260/