WCF和依赖属性中的线程(调用线程无法访问此对象,因为不同的线程拥有它的异常)

时间:2013-02-28 01:45:46

标签: c# multithreading wcf

非常感谢任何帮助。

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

我们在WCF服务端看到有时并且不一致的崩溃,并出现以下异常消息:

" 调用线程无法访问此对象,因为另一个线程拥有它"。

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

从阅读中我了解到,有一种情况是在不同的线程上调用getter,这就是为什么我们不能一直看到这个异常。

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

有人可以提出建议吗?

谢谢,

埃拉德

3 个答案:

答案 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

相关部分接近文章末尾。听起来他正在描述你的确切问题。