WCF中的线程和依赖属性(调用线程不能访问这个对象,因为另一个线程拥有它的异常)

本文关键字:线程 因为 对象 另一个 异常 拥有 访问 依赖 属性 WCF 不能 | 更新日期: 2023-09-27 18:01:41

如有任何帮助,我将不胜感激。

我们有一个WCF服务(托管在IIS中),它正在调用一个方法,在这个方法中有一个对依赖属性的getter的调用(这个getter是几个依赖属性的一部分,聚集在一个对象中,用于各种转换)。

我们有时会看到WCF服务端崩溃,但不一致,并伴有以下异常消息:

"调用线程不能访问这个对象,因为它被另一个线程拥有"。

我搜索了一下,发现了一个类似的问题。

从阅读中,我理解有一个场景中getter在不同的线程上被调用,这就是为什么我们不会一直看到这个异常。

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

有人能给点建议吗?

谢谢,

兰德

WCF中的线程和依赖属性(调用线程不能访问这个对象,因为另一个线程拥有它的异常)

你能做的就是在你的"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);
        }
    }
}
相关文章: