2012-01-28 68 views
1

我有一個C#程序,它將有多個實例需要相互通信,執行命令並來回發送數據。現在,這是使用WM_COPYDATA來完成的,這非常麻煩。我想使用NetNamedPipeBindings將其升級到WCF系統。但是,無論我嘗試什麼設置,我都無法獲得可重入雙工通信的工作。與WCF的可重入雙工通信

這將是一個正常的WCF電話:

client calls proxy.foo 
    server executes foo 
    server finishes foo 
client returns from proxy.foo 

而這正是我想要的:

client calls proxy.foo 
    server executes foo 
    server calls callback.bar 
     client executes bar 
     client calls proxy.baz 
      server executes baz 
      server finishes baz 
     client returns from proxy.baz 
     client finishes bar 
    server returns from callback.bar 
    server finishes foo 
client returns from proxy.foo 

重要的是,我想調用proxy.foo是同一個線程客戶線程調用proxy.baz。對於Windows消息,這是課程的標準。但無論我嘗試什麼設置,我都無法通過WCF獲取此模式。它甚至有可能嗎?

回答

2

除非你打電話異步和手動處理交錯和(可能)封送到正確的線程,我看不出它是如何可能的。畢竟,客戶端(線程)正在調用服務器並被阻塞,直到服務器返回響應。因此,回撥給客戶端會導致代碼死鎖,因爲客戶端線程已經被阻塞。

+0

感嘆......我想我會堅持使用COPYDATA。我很驚訝WCF不支持這一點。 – 2012-01-29 19:21:54

+1

我對此做了一些測試,雖然上面的內容有點正確,但並不完整。 :S如果設置ConcurrencyMode = ConcurrencyMode.Reentrant並且clint線程具有同步上下文(就像在WinForm中或自己創建一個),回調將自動結合到原始線程。它還需要服務器調用來實現異步模式,因爲(如上所述)來自客戶端的原始調用需要被異步化。 我做了一個「小」測試項目,你可以看看: [link](http://www.noer.it/upload/Test_WcfReentrant.zip) – Reonekot 2012-02-01 09:00:26