WCF 客戶端資源(連接埠、通道)釋放不當會導致連接殘留、資源浪費、影響效能穩定。雖實作 IDisposable 可用 using,但 using 區塊拋出異常時可能無法正確回收,連接持續佔用。
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)。
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();Using<T>(T client, Action<T> action)。Util.Using(new MyClient(), c => { c.SomeWCFOperation(); });
語法接近 using,自動處理異常分支。IDisposable,在 Dispose/Close 中捕獲異常並呼叫 Abort(),可直接用於 using。using (var factory = new MyChannelFactory(ChannelFactory<IService>.CreateBinding())) { ... }
本質皆為對冗長 try/catch/finally 的封裝,確保資源正確釋放,保障系統安全、效能與穩定。