關於WCF客戶端對象的釋放:Close( ) & Abort( )

其實六七年前WCF盛行的時候也討論過這個問題。

 

Close( ) 使 ClientBase<TChannel> 對象從其當前狀態轉換到關閉狀態。

Abort( ) 使 ClientBase<TChannel> 對象立即從其當前狀態轉換到關閉狀態。

文檔描述僅僅能看出“立即”兩個字的差別,但究竟該怎麼用就有點迷茫了。

 

通過反編譯可以發現,兩個方法源自接口 ICommunicationObject,該接口“爲系統中所有面向通信的對象(包括通道、通道管理器、工廠、偵聽器以及調度程序和服務主機)定義基本狀態機的協定。”

觀察源碼可知 Abort( ) 方法不會拋出異常, 而 Close( )方法則可能拋出 TimeoutExceptionCommunicationException

 

另外,ClientBase<TChannel> 實現了接口 IDisposable接口,這意味着我們可以在代碼中使用 using 語句塊,這樣在出作用域時會自動調用 Dispose( ) 方法來釋放資源。不過Dispose( )方法內部也僅僅是調用了 Close( )方法,因此也是存在拋異常的可能。

究竟該怎麼用??

這裏直接給出最佳實踐,感興趣的同學可以反編譯查看源碼。

 1 try
 2 {
 3     ...
 4     client.Close();
 5 }
 6 catch (CommunicationException e)
 7 {
 8     ...
 9     client.Abort();
10 }
11 catch (TimeoutException e)
12 {
13     ...
14     client.Abort();
15 }
16 catch (Exception e)
17 {
18     ...
19     client.Abort();
20     throw;
21 }

 

引用:MSDN

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章