我的WCF服務使用netTcpBinding,並且有一個回調對象。WCF雙工通道在使用回調函數時關閉
我需要服務多個併發客戶端,和十個分量會議,所以服務上裝飾有
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
爲了避免線程死鎖,回調類裝飾有
[CallbackBehavior(UseSynchronizationContext=false)]
我用SynchronizationContext
在UI線程中執行該方法。
問題是,有時頻道的關閉無意義(ICommunicationObject.Closing
事件被觸發)。之後,我在任何後續服務電話中都會收到例外情況。
查看跟蹤文件,最後一條消息是回調函數,但是回調函數永遠不會被調用。沒有例外。
經過一些調試後,我發現只有在同步操作中間進行回調調用時纔會發生這種情況。具體的步驟是這樣的:
- 呼叫服務方法
A
與IsOneWay=true
- 呼叫服務方法
B
與IsOneWay=false
A
調用回調方法,但B
仍在執行。
這應該不是問題,因爲回調有UseSynchronizationContext=false
,所以回調調用可以在單獨的線程中處理。
我無法在更簡單的情況下重現問題。在一個簡單的項目中執行這些步驟將成功執行
任何想法可能發生什麼或如何識別問題?
代碼片段可能會從客戶端和服務端受益。 – Perpetualcoder 2009-11-18 15:57:31