我是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(或类似方法)的任何指导,均应赞赏。

最佳答案

实际上,我建议您避免使用DispatcherCoreDispatcher等。总会有更好的解决方案。

在这种情况下,您可以使用进度更新。以下是一些应在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/

10-11 12:55