2013-02-28 77 views
0

任何帮助将不胜感激。线程在WCF和依赖属性(调用线程不能访问此对象,因为不同的线程拥有它的例外)

我们有一个调用方法的WCF服务(在IIS中托管),并且在此方法内部调用了一个依赖属性的getter(这个getter是在单个对象中收集的几个依赖属性的一部分并用于所有类型的转换)。

我们有时会看到,而不是一致的,在WCF服务端崩溃,与下面的异常消息:

调用线程不能因为不同的线程拥有它访问该对象”。

我做了一些搜索,发现了一个similar problem

从阅读中我明白,有一种情况是在不同的线程上调用getter,这就是为什么我们没有看到这个例外的原因。

但是,我仍然对解决方案感到困惑。 WCF服务是否有一个可以激活CheckAccess()然后调用Dispatcher.Invoke()方法的调度程序(就像在WPF应用程序中一样)?

有人能请指教吗?

感谢,

埃拉德

+2

为什么在IIS中使用'DependencyObject'?这就是根本问题 - 一般来说,'DependencyObject'类绝不会被用在具有合适的'Dispatcher'的系统之外。 – 2013-02-28 01:54:30

+0

我认为依赖属性是WPF特有的?这也是一个WPF应用程序? – 2013-02-28 01:54:43

+0

这不是一个WPF应用程序。这是一个使用某种基础结构包含一组对象的WCF服务,其中有几个公开依赖项属性。我们继承了这个基础设施,需要使用它。 – 2013-02-28 02:01:24

回答

0

ALL DependencyObjects有线程亲和力。它们只能由实例化它的线程访问。调用DependencyObject.CheckAccess()来确定是否在正确的线程上。 下面是一个例子。即使代码使用Button,Button仍然是一个DependencyObject。

private void TryToUpdateButtonCheckAccess(object uiObject) 
{ 
    Button theButton = uiObject as Button; 

    if (theButton != null) 
    { 
     // Checking if this thread has access to the object 
     if(theButton.CheckAccess()) 
     { 
      // This thread has access so it can update the UI thread 
      UpdateButtonUI(theButton); 
     } 
     else 
     { 
      // This thread does not have access to the UI thread 
      // Pushing update method on the Dispatcher of the UI thread 
      theButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
       new UpdateUIDelegate(UpdateButtonUI), theButton); 
     } 
    } 
} 
+0

史蒂文,非常感谢这个例子。我对WPF中的这种模式很熟悉,我认为在WCF中有类似的情况,以防“结合”依赖属性。 – 2013-03-01 03:35:35

0

你可以做什么是你的“主”线程从DispatcherObject继承创建一个类。这将使您可以访问WCF中的Dispatcher属性。

相关问题