线程安全,Silverlight

时间:2010-09-20 21:53:09

标签: silverlight thread-safety

我经常使用RIA WCF服务,并在几个ViewModel中注入相同的上下文。我的问题是,正如您所知,RIA服务的上下文不是线程安全的。

所以我的解决方案“自制”用于同步。我使用背景工作者,并使用PostSharp,我应用我的属性 [UniqueThread(“Data”)]关于方法和瞧。

我是否复杂化了?有更简单的解决方案吗?

此致敬意,
Vincent BOUZON

2 个答案:

答案 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在不同的线程上运行。当然,默认情况下,您编写的任何内容都将在主要前台线程上运行,并且不应该需要参与您所描述的那些复杂的事情。或者您的视图模型实际上是在不同的(后台)线程上运行的?