2014-03-07 42 views
0

我有一個客戶端 - 服務器應用程序。他們與.NET Remoting (4.0)互相溝通。服務器是服務,客戶端是WPF UI應用程序。有時調用服務器在UI線程上執行。這是不好的做法,因爲如果延遲發生,UI會凍結。我想避免這種如何捕獲.net遠程調用並檢查客戶端的線程?

所以我想補充一個全球性的驗證(例如,在調試模式)每個遠程調用:

[Conditional("DEBUG")] 
public static void CheckNotUIThread() 
{ 
    if (System.Windows.Application.Current.Dispatcher.CheckAccess()) 
     throw new InvalidOperationException("Remoting call on UI thread"); 
} 

所以我想在客戶端在哪裏可以我趕上遠程調用爲了驗證線程?

編輯:

的對象服務器返回特別是所有從MarshalByRefObject的。其他對象是POCO或其組合,標記爲[可序列化]。

+0

爲什麼你在一個WPF項目中使用Remoteing,你在鏈接的頁面的第一行看到了大的粗體文本嗎? 「***本主題特定於遺留技術,爲保持與現有應用程序的向後兼容性而保留,不建議用於新開發。***」編輯:在閱讀您對antistar答案的回覆之後,您看起來像是在編寫新的客戶端爲現有的應用程序。 –

+0

是的,我看到了。我把這件事告訴了我們的建築師很多時間。答案 - 目前系統很大,沒有時間將它移動到WCF。是的,我們只有服務器API,並且我們使用該API開發WPF UI客戶端。 – stukselbax

回答

2

您可以擴展RealProxy類並攔截遠程調用。 請檢查這個鏈接: http://blogs.msdn.com/b/geoffda/archive/2007/11/07/using-a-custom-proxy-for-interception.aspx

+0

這種方法的一個很大的缺點是它需要爲服務器和客戶端編寫通用API。我無法更改該API - 我只能獲取對象。下一個是不支持[將代理屬性應用於MarshalByRefObject的子項。](http://msdn.microsoft.com/en-us/library/scx1w94y(v = vs.100).aspx)。至於我使用的服務器返回** MarshalByRefObject **,情況並非如此。 – stukselbax