2013-02-28 80 views
0

任何幫助將不勝感激。線程在WCF和依賴屬性(調用線程不能訪問此對象,因爲不同的線程擁有它的例外)

我們有一個調用方法的WCF服務(在IIS中託管),並且在此方法內部調用了一個依賴屬性的getter(這個getter是在單個對象中收集的幾個依賴屬性的一部分並用於所有類型的轉換)。

我們有時會看到,而不是一致的,在WCF服務端崩潰,與下面的異常消息:

調用線程不能因爲不同的線程擁有它訪問該對象」。

我做了一些搜索,發現了一個similar problem

從閱讀中我明白,有一種情況是在不同的線程上調用getter,這就是爲什麼我們沒有看到這個例外的原因。

但是,我仍然對解決方案感到困惑。 WCF服務是否有一個可以激活CheckAccess()然後調用Dispatcher.Invoke()方法的調度程序(就像在WPF應用程序中一樣)?

有人能請指教嗎?

感謝,

埃拉德

+2

爲什麼在IIS中使用'DependencyObject'?這就是根本問題 - 一般來說,'DependencyObject'類絕不會被用在具有合適的'Dispatcher'的系統之外。 – 2013-02-28 01:54:30

+0

我認爲依賴屬性是WPF特有的?這也是一個WPF應用程序? – 2013-02-28 01:54:43

+0

這不是一個WPF應用程序。這是一個使用某種基礎結構包含一組對象的WCF服務,其中有幾個公開依賴項屬性。我們繼承了這個基礎設施,需要使用它。 – 2013-02-28 02:01:24

回答

0

ALL 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); 
     } 
    } 
} 
+0

史蒂文,非常感謝這個例子。我對WPF中的這種模式很熟悉,我認爲在WCF中有類似的情況,以防「結合」依賴屬性。 – 2013-03-01 03:35:35

0

你可以做什麼是你的「主」線程從DispatcherObject繼承創建一個類。這將使您可以訪問WCF中的Dispatcher屬性。

相關問題