我是 Windows Phone Dev 的新手,正在将我的 WP8 SilverLight 应用程序迁移到 WP8.1 WinRT。下面是我在 WP8 的 ViewModel 上的工作代码,它不适用于商店应用程序。
代码背后的逻辑是每秒更新 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 for wp8.1 env 的 Async Task 和 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# - 将 Async Task 与 Dispatcher 结合使用以从 ViewModel 循环更新 WP8.1 WinRT 的 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890260/