线程在WCF和依赖属性(调用线程不能访问此对象,因为不同的线程拥有它的例外)
任何帮助将不胜感激。线程在WCF和依赖属性(调用线程不能访问此对象,因为不同的线程拥有它的例外)
我们有一个调用方法的WCF服务(在IIS中托管),并且在此方法内部调用了一个依赖属性的getter(这个getter是在单个对象中收集的几个依赖属性的一部分并用于所有类型的转换)。
我们有时会看到,而不是一致的,在WCF服务端崩溃,与下面的异常消息:
“调用线程不能因为不同的线程拥有它访问该对象”。
我做了一些搜索,发现了一个similar problem。
从阅读中我明白,有一种情况是在不同的线程上调用getter,这就是为什么我们没有看到这个例外的原因。
但是,我仍然对解决方案感到困惑。 WCF服务是否有一个可以激活CheckAccess()然后调用Dispatcher.Invoke()方法的调度程序(就像在WPF应用程序中一样)?
有人能请指教吗?
感谢,
埃拉德
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);
}
}
}
史蒂文,非常感谢这个例子。我对WPF中的这种模式很熟悉,我认为在WCF中有类似的情况,以防“结合”依赖属性。 – 2013-03-01 03:35:35
由于您的问题是在多个线程之间访问依赖项属性,因此您可以在WCF服务中使用STA线程模型。
本文介绍的方法
http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF
相关的部分是靠近文章的末尾。这听起来像他正在描述你的确切问题。
为什么在IIS中使用'DependencyObject'?这就是根本问题 - 一般来说,'DependencyObject'类绝不会被用在具有合适的'Dispatcher'的系统之外。 – 2013-02-28 01:54:30
我认为依赖属性是WPF特有的?这也是一个WPF应用程序? – 2013-02-28 01:54:43
这不是一个WPF应用程序。这是一个使用某种基础结构包含一组对象的WCF服务,其中有几个公开依赖项属性。我们继承了这个基础设施,需要使用它。 – 2013-02-28 02:01:24