c# - 将 Async Task 与 Dispatcher 结合使用以从 ViewModel 循环更新 WP8.1 WinRT 的 UI 线程

标签 c# multithreading windows-runtime async-await windows-phone-8.1

我是 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(或类似方式)的指导。

最佳答案

实际上,我建议您避免 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# - 将 Async Task 与 Dispatcher 结合使用以从 ViewModel 循环更新 WP8.1 WinRT 的 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890260/

相关文章:

c# - 如何在移动应用程序上进行身份验证后在 .NET Core 服务器上登录用户

c# - 使用循环获取 ListView 中的每个项目?

android - 如何从线程开始在 Activity 中播放音乐?

wpf - 如何在 WPF 窗口中使用 WinRT SwapChainPanel 控件?

C# 参数化 Oracle 更新在 ExecuteNonQuery 上失败

c# - 基于字典比较两个对象的相等性

java - 关闭舞台/窗口时终止所有子线程

c# - 在另一个线程中安全地访问字典?

windows-8 - 无法将 Windows 8.1 应用程序部署到 Window 8 设备

c# - 在 Windows 应用商店应用程序中,如果我定期从 LocalFolder 中的文件夹读取数据,我可以保留静态引用吗?