我经常使用RIA WCF服务,并在几个ViewModel中注入相同的上下文。我的问题是,正如您所知,RIA服务的上下文不是线程安全的。
所以我的解决方案“自制”用于同步。我使用背景工作者,并使用PostSharp,我应用我的属性 [UniqueThread(“Data”)]关于方法和瞧。
我是否复杂化了?有更简单的解决方案吗?
此致敬意,
Vincent BOUZON
答案 0 :(得分:4)
在我们的例子中,我们向BaseViewModel添加了一个OnUiThread方法(它还提供了INotifypropertyChanged处理程序和一些其他方便的util方法)。
每当我们需要确保在UI线程上完成操作时,我们使用lambda表达式(或回调函数)调用OnUiThread来完成工作。
protected delegate void OnUiThreadDelegate();
protected void OnUiThread(OnUiThreadDelegate onUiThreadDelegate)
{
if (Deployment.Current.Dispatcher.CheckAccess())
{
onUiThreadDelegate();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(onUiThreadDelegate);
}
}
呼叫的示例可能如下所示:
this.OnUiThread(() =>
{
this.ViewModelList = resultList;
});
答案 1 :(得分:0)
这肯定看起来过于复杂,除非你已经做了很多其他工作来强制你的viewmodels在不同的线程上运行。当然,默认情况下,您编写的任何内容都将在主要前台线程上运行,并且不应该需要参与您所描述的那些复杂的事情。或者您的视图模型实际上是在不同的(后台)线程上运行的?