首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 客戶端資源釋放最佳實踐:透過 Dispose 模式實現有效重用

     編輯:關於.NET

WCF 客戶端資源(連接埠、通道)釋放不當會導致連接殘留、資源浪費、影響效能穩定。雖實作 IDisposable 可用 using,但 using 區塊拋出異常時可能無法正確回收,連接持續佔用。

微軟推薦模式:try/catch/finally

var client = new MyClient();
try {
    // 業務邏輯
    client.Close();
}
catch (CommunicationException) { client.Abort(); }
catch (TimeoutException) { client.Abort(); }
catch (Exception) { client.Abort(); throw; }

Close() 可能拋出 CommunicationException/TimeoutException,Abort() 強制關閉並釋放資源。最後捕獲 Exception 防禦不可預期異常(如 OOM)。

三種封裝方案

  1. 擴展方法(Steve Smith):擴展 ICommunicationObject,提供 CloseConnection() 封裝上述邏輯。
    public static void CloseConnection(this ICommunicationObject client) {
        if (client.State != CommunicationState.Opened) return;
        try { client.Close(); }
        catch (CommunicationException) { client.Abort(); }
        catch (TimeoutException) { client.Abort(); }
        catch (Exception) { client.Abort(); throw; }
    }
    
    使用:client.CloseConnection();
  2. Lambda 表達式包裝:靜態 Using<T>(T client, Action<T> action)。
    Util.Using(new MyClient(), c => { c.SomeWCFOperation(); });
    
    語法接近 using,自動處理異常分支。
  3. 自訂 ChannelFactory Wrapper:實作 IDisposable,在 Dispose/Close 中捕獲異常並呼叫 Abort(),可直接用於 using。
    using (var factory = new MyChannelFactory(ChannelFactory<IService>.CreateBinding())) { ... }
    

本質皆為對冗長 try/catch/finally 的封裝,確保資源正確釋放,保障系統安全、效能與穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved