WCF中的线程和依赖属性(调用线程不能访问这个对象,因为另一个线程拥有它的异常)
本文关键字:线程 因为 对象 另一个 异常 拥有 访问 依赖 属性 WCF 不能 | 更新日期: 2023-09-27 18:01:41
如有任何帮助,我将不胜感激。
我们有一个WCF服务(托管在IIS中),它正在调用一个方法,在这个方法中有一个对依赖属性的getter的调用(这个getter是几个依赖属性的一部分,聚集在一个对象中,用于各种转换)。
我们有时会看到WCF服务端崩溃,但不一致,并伴有以下异常消息:
"调用线程不能访问这个对象,因为它被另一个线程拥有"。
我搜索了一下,发现了一个类似的问题。
从阅读中,我理解有一个场景中getter在不同的线程上被调用,这就是为什么我们不会一直看到这个异常。
然而,我仍然对解决方案感到困惑。WCF服务是否有一个调度程序,我可以在其上激活CheckAccess(),然后调用dispatcher . invoke()方法(就像在WPF应用程序中一样)?
有人能给点建议吗?
谢谢,
兰德
你能做的就是在你的"primary"线程中创建一个继承自DispatcherObject的类。这将允许您访问WCF中的Dispatcher属性。
因为你的问题是跨多个线程访问依赖属性,你可以在你的WCF服务中使用STA线程模型。
本文描述了方法
http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF相关部分在文章的末尾。听起来他说的正是你的问题。
所有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);
}
}
}