其實六七年前WCF盛行的時候也討論過這個問題。
Close( ) 使 ClientBase<TChannel> 對象從其當前狀態轉換到關閉狀態。
Abort( ) 使 ClientBase<TChannel> 對象立即從其當前狀態轉換到關閉狀態。
文檔描述僅僅能看出“立即”兩個字的差別,但究竟該怎麼用就有點迷茫了。
通過反編譯可以發現,兩個方法源自接口 ICommunicationObject,該接口“爲系統中所有面向通信的對象(包括通道、通道管理器、工廠、偵聽器以及調度程序和服務主機)定義基本狀態機的協定。”
觀察源碼可知 Abort( ) 方法不會拋出異常, 而 Close( )方法則可能拋出 TimeoutException 和 CommunicationException。
另外,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