C# 使用异步任务和Dispatcher从ViewModel更新WP8.1 WinRT循环中的UI线程

C# 使用异步任务和Dispatcher从ViewModel更新WP8.1 WinRT循环中的UI线程,c#,multithreading,windows-runtime,async-await,windows-phone-8.1,C#,Multithreading,Windows Runtime,Async Await,Windows Phone 8.1,我是Windows Phone开发人员的新手,正在将我的WP8 SilverLight应用程序迁移到WP8.1 WinRT。下面是我的ViewModel for WP8的工作代码,它不适用于商店应用程序 代码背后的逻辑是每秒更新UI线程上的Xaml txtBox值,这是在UpdateTicker()方法中完成的 WP8工作代码: Task.Run(async () => { while (true) {

我是Windows Phone开发人员的新手,正在将我的WP8 SilverLight应用程序迁移到WP8.1 WinRT。下面是我的ViewModel for WP8的工作代码,它不适用于商店应用程序

代码背后的逻辑是每秒更新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);
            }
        });
        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
                });
            }
        });
在MSDN上进行了大量搜索之后,我找到了下面的代码,wp8.1 winRT的编译很好,但仍然不起作用-当设置断点时,调试器只到达Updatecker()步骤一次,而
Updatecker
方法应该每秒调用一次(这是第一段代码的情况)

WP8.1 WinRT代码:

        Task.Run(async () =>
        {
            while (true)
            {
                await Task.Delay(1000);
                Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    UpdateTicker(); // this method gets called every second
                }), null);
            }
        });
        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
                });
            }
        });

欢迎提供有关使用异步任务和Dispatcher.BeginInvoke(或类似)和wp8.1 env的ViewModel的任何指导。

实际上,我建议您避免使用
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);
  }
});
IProgress progress=new progress(=>UpdateTicker());
Task.Run(异步()=>
{
while(true)
{
等待任务。延迟(1000);
进度报告(空);
}
});

旁注:在生产代码中,您几乎不希望只启动一个
任务。请运行
,不要对返回的
任务执行任何操作。至少,您应该有一些代码(异步)等待捕获循环中的任何异常。

您能定义“不工作”的含义吗?UpdateTicker()不会像在我的wp8 env下的第一个代码块中那样每秒都被调用。我不熟悉WinRT,但感觉就像在第二个实例中,您得到了一个后台线程的调度程序。我认为需要从UI线程调用
GetForCurrentThread
<代码>任务。运行
将导致从后台线程调用代码。我可能是错的。这里有另一个线程,他们已经实现了我想要的,但这一个是来自代码隐藏,我正在寻找一些类似的,但可以从ViewModel调用…我看到有人说,将调度程序从UI线程传递到后台线程中运行的代码。我想试试。嘿,这个对我有用。事实上,我从来没有偶然遇到过我的进步课。它们看起来很整洁。我也会考虑你的建议和边注。谢谢