我正在使用MVVM模式为Windows Store和Windows Phone 8开发同一应用程序的两个版本。每个应用都有自己的视图。 Model和ViewModel在Portable Class Libraray中共享。我使用TPL任务在模型中执行异步操作。由于可移植类库的限制,我无法使用async和await关键字。如何在异步操作后返回到UI线程
任务完成后,我想回到UI线程并更新一些属性(这会导致ViewModel和View也更新)。
在我看来,这似乎是一个很常见的情况,所以我有点困惑,为什么它变得如此艰难。
我尝试了两种不同的方法:在开始操作
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
然后将它传递给ContinueWith
方法之前
一个(不工作)
保存到调度一个参考。
myTask.ContinueWith(t => myTaskCompleted(t.Result), scheduler);
在我看来,这似乎是一个很好的解决方案,但不起作用。 myTaskCompleted仍然在不同的线程中执行。
二
现在我试图使用
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, handler);
因为我不能从PCL使用分派器直接,我传递给它(隐藏在一个包装)的引用,以几乎所有的对象在模型中。 (就像在这answer)这最后的作品,但它是相当复杂和丑陋。
所以我的问题是:
- 这是建议的方式要回UI线程便携类Libraray里面?
- 我尝试的错误是什么一个?
我知道那里已经有很多关于这个话题的问题,但不幸的是没有真正解决我的问题。
第一次尝试时代码的上下文是什么?请记住,如果您目前不在UI线程中,那么TaskScheduler.FromCurrentSynchronizationContext()不会获取UI线程的上下文。如果您已经在后台线程中,则为时已晚,您需要早一点抓取它。 – Servy 2013-03-12 21:07:23
Duplicate:http://stackoverflow.com/questions/11258164/portable-class-library-equivalent-of-dispatcher-invoke-or-dispatcher-runasync(至少他们看起来是一样的我) – 2013-03-12 21:07:53
你看着[ Microsoft.Bcl.Async(http://nuget.org/packages/Microsoft.Bcl.Async/)?你的第一种方法对我来说是正确的 - 除非@Servy建议你的'FromCurrentSynchronizationContext'不在UI线程上运行。 – 2013-03-12 21:13:19