0

任何帮助将不胜感激。

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

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

调用线程无法访问此对象,因为不同的线程拥有它”。

我做了一些搜索,发现了一个类似的问题

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

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

有人可以建议吗?

谢谢,

埃拉德

4

3 回答 3

0

您可以做的是在继承自DispatcherObject的“主”线程中创建一个类。这将使您能够访问 WCF 中的 Dispatcher 属性。

于 2013-03-05T18:06:19.297 回答
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);
        }
    }
}
于 2013-02-28T05:35:16.750 回答
0

由于您的问题与跨多个线程访问依赖项属性有关,因此您可以在 WCF 服务中使用 STA 线程模型。

本文介绍了该方法

http://www.netfxharmonics.com/2009/07/Accessing-WPF-Generated-Images-Via-WCF

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

于 2013-03-05T18:29:18.020 回答