2013-08-16 35 views
0

我看着微軟的雙工WCF示例:任何方式來判斷DuplexClientBase是否忙?

它開始here但我們感興趣的是在here與客戶結束。

// Wait for callback messages to complete before 
    // closing. 
    System.Threading.Thread.Sleep(5000); 

    // Close the WCF client. 
    wcfClient.Close(); 
    Console.WriteLine("Done!"); 

如果你把睡眠,你會得到一個異常

郵件傳輸完成之前會話被關閉。

很清楚,客戶知道空氣中有東西,有沒有辦法要求它的當前狀態?有一個狀態,但只是定義它是打開還是關閉(即連接不活動)。

回答

1

這不完全正確。你的方法是單向方法調用。因此,當您從客戶端調用服務時,該呼叫(或一組呼叫)已完成。換句話說,「消息」已經交付給服務,並且由於它是單向的,所以沒有期望迴應。它可能在回調合約上回調......它可能不會。

當您設置雙工通道時,您站立了一個端點以使服務能夠回撥(客戶端基本成爲服務)。如果關閉客戶端,那麼如果/當服務決定回撥時,通信異常將發生。這就是這種消息交換模式的工作方式。

你真的有點回答你自己的問題。也就是說,當你檢查狀態時,它是打開的,關閉的(或故障的)。當您使用雙工通道時,在這種情況下打開意味着通道上可能存在「活動」。這就是睡眠的原因 - 允許服務時間回撥。如果您查看SDK示例(http://msdn.microsoft.com/en-us/library/vstudio/ms752216(v=vs.110).aspx),它基本上會做同樣的事情,除非它在那裏等待您在關閉客戶端應用程序之前按ENTER鍵。

所以,在實際應用中(而不是基於控制檯的樣本像這些都是),要麼讓你的客戶端代理主動或更改消息交換模式的請求/響應模式。

+0

是的,在我的實際應用程序,我用更多的是發佈 - 訂閱模式,所以你所謂的退訂之後,你真的不希望收到回調。我驚訝地發現,在「早」關閉wcfClient後,客戶端應用程序中出現異常。我會標記你是正確的,因爲你好,但請隨時再評論。 – Ian

+1

這是因爲存在雙工綁定的可靠會話。在您的服務中調用方法後,ReliabeSession將發送交換消息(在通道層中)以保證消息傳遞。因此,從純粹的「服務」角度來看,仍然有一些信息正在交換。它們不是你的 - 它們是ReliableSession消息。在這些消息完成之前,您正在關閉所有的東西。 –

+0

哦,我明白了,我不知道。有沒有辦法知道可靠的會話是否仍然「活躍」? – Ian

相關問題