我正在使用 MVVM 模式为 Windows Store 和 Windows Phone 8 开发同一个应用程序的两个版本。每个应用程序都有自己的视图。Model 和 ViewModel 在 Portable Class Libraray 中共享。我正在使用 TPL 任务在模型中执行异步操作。由于 Portable Class Library 的限制,我不能使用 async 和 await 关键字。
任务完成后,我想回到 UI 线程并更新一些属性(这将导致 ViewModel 和 View 也更新)。
在我看来,这似乎是一个很常见的情况,所以我有点困惑为什么它会变得如此困难。
我尝试了两种不同的方法:
一个(不起作用)
在开始操作之前保存对调度程序的引用
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
然后将其传递给ContinueWith
方法。
myTask.ContinueWith(t => myTaskCompleted(t.Result), scheduler);
在我看来,这似乎是一个很好的解决方案,但不起作用。myTaskCompleted 仍然在不同的线程中执行。
第二
现在我尝试使用
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, handler);
因为我不能直接使用 PCL 中的 Dispatcher,所以我将对它的引用(隐藏在包装器中)传递给模型中的几乎每个对象。(就像在这个答案中一样)这终于奏效了,但它非常复杂和丑陋。
所以我的问题是:
- 哪种方法可以返回到 Portable Class Libraray 中的 UI 线程?
- 我在尝试一中的错误是什么?
我知道这个话题已经有很多问题了,但不幸的是,没有什么能真正解决我的问题。