不要在using語句中呼叫WCF服務

2021-07-15 18:26:43 字數 1462 閱讀 7903

如果你呼叫wcf服務時,像下面的**這樣在using語句中進行呼叫,需要注意乙個問題。

using (cnblogswcfclient client = new cnblogswcfclient())

上面這段**看上去沒問題,cnblogswcfclient是乙個自動生成的wcf客戶端**,繼承自system.servicemodel.clientbase。using語句結束時,會呼叫clientbase實現的system.idisposable.dispose介面,實際就是呼叫clientbase的close()方法。用.net refector開啟c:\windows\microsoft.net\framework\v4.0.30319\system.servicemodel.dll,可以看到這樣的**,見下圖:

不僅看上去沒問題,似乎就是沒問題。但是...問題就出在clientbase.close()上,close()要關閉的是乙個網路連線,如果這時網路連線出現問題,不能正常關閉會引發異常(clientbase的close方法就是這樣設計的,引發異常,而不是強制關閉),問題就來了。本來我們使用using的目的就是不管出現什麼狀況,即使天塌下來,也給我關閉掉;結果,關是關了,卻沒有閉,天還是塌下來了。

也許我們可以用「不可抗拒力」迴避這個問題,但程式設計師的天性是解決問題。**中任何乙個小問題都不能忽視,因為我們很難預料這個小問題會不會帶來大問題。

那如何解決這個問題呢?msdn中有答案(去msdn看看),**如下:

cnblogswcfclient client = new cnblogswcfclient();

trycatch (communicationexception e)

catch (timeoutexception e)

catch (exception e)

上面的**顯得有些哆嗦,如果你不關心是什麼異常,只要出現異常就關閉的話,可以用下面的**(**來自tip: 

closing your wcf connections properly

):

cnblogswcfclient client = new cnblogswcfclient();

client.say("hello, cnblogs.com!");

try}

catch (exception ex)

簡化版**:

cnblogswcfclient client = new cnblogswcfclient();

client.say("hello, cnblogs.com!");

trycatch

好了,部落格寫好了,印象更深了,理解也更深了。在收穫中分享,在分享中收穫。

不要在建構函式中呼叫可重寫的方法

原因 非密封型別的構造函式呼叫其類中定義的虛方法。規則說明 呼叫虛方法時,直到執行時之前都不會選擇執行該方法的實際型別。構造函式呼叫虛方法時,可能尚未執行呼叫該方法的例項的建構函式。如何修復衝突 要修復與該規則的衝突,請不要從某型別的建構函式中呼叫該型別的虛方法。何時禁止顯示警告 不要禁止顯示此規則...

Using 語句中出現異常,資源能夠被釋放嗎?

using語句在.net中常用來釋放實現system.idisposable介面的類的例項的資源。但是如果在using語句 現異常,該資源是否能夠被正確釋放?以下通過 來證明 namespace usingdemo private void test void button2click object...

千萬不要在構造器中呼叫可覆 寫的方法。

下面這個程式有兩個不可變的值類 value class 值類即其實例表示值的類。第乙個類用整數座標來表示平面上的乙個點,第二個類在此基礎上新增了一點顏色。主程式將建立和列印第二個類的乙個例項。那麼,下面的程式將列印出什麼呢?class point protected string makename ...