非常感谢任何帮助。
我们有一个调用方法的WCF服务(在IIS中托管),并且在此方法内部调用依赖项属性的getter(此getter是在单个对象中收集的几个依赖项属性的一部分,用于所有类型的转换)。
我们在WCF服务端看到有时并且不一致的崩溃,并出现以下异常消息:
" 调用线程无法访问此对象,因为另一个线程拥有它"。
我做了一些搜索,发现了similar problem。
从阅读中我了解到,有一种情况是在不同的线程上调用getter,这就是为什么我们不能一直看到这个异常。
但是,我仍然对这个解决方案感到困惑。 WCF服务是否有一个调度程序,我可以在其上激活CheckAccess()然后调用Dispatcher.Invoke()方法(如在WPF应用程序中)?
有人可以提出建议吗?
谢谢,
埃拉德
答案 0 :(得分:0)
所有DependencyObject都具有线程关联性。它们只能由实例化它的线程访问。调用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);
}
}
}
答案 1 :(得分:0)
您可以做的是在“主”线程中创建一个继承自DispatcherObject的类。这将使您可以访问WCF中的Dispatcher属性。
答案 2 :(得分:0)
由于您的问题与跨多个线程访问依赖项属性有关,因此您可以在WCF服务中使用STA线程模型。
本文介绍了该方法
http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF
相关部分接近文章末尾。听起来他正在描述你的确切问题。