2012-01-30 44 views
10

我正在使用以下方法關閉WCF 4通道。這是正確的做法嗎?正確關閉WCF 4通道的方法

using (IService channel 
    = CustomChannelFactory<IService>.CreateConfigurationChannel()) 
{ 
    channel.Open(); 

    //do stuff 
}// channels disposes off?? 

回答

8

儘管不是嚴格衝着通道,你可以這樣做:

ChannelFactory<IMyService> channelFactory = null; 
try 
{ 
    channelFactory = 
     new ChannelFactory<IMyService>(); 
    channelFactory.Open(); 

    // Do work... 

    channelFactory.Close(); 
} 
catch (CommunicationException) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
} 
catch (TimeoutException) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
} 
catch (Exception) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
    throw; 
} 
+0

該響應有點不合適:它提供了ChannelFactory的使用模式,而原始問題涉及該通道。儘管確實(我相信)關閉工廠將關閉其創建的所有通道,但更常見的模式是保持通道工廠處於打開狀態,以便可以高效地創建多個通道。每個通道應該單獨關閉,同時保持工廠的工作。 – 2013-06-06 16:16:30

+0

這是真的 - 謝謝你指出。已調整後發佈 – 2013-06-10 06:53:39

+0

@ÖrjanJämte謝謝已更新 – 2017-03-22 12:56:43

17

曾經是釋放WCF客戶端代理在WCF的「早」天普遍接受的方式。

然而事情已經改變。原來IClientChannel<T>.Dispose()的實現只是調用IClientChannel<T>.Close()方法,在某些情況下可能會拋出異常,比如底層通道未打開或無法及時關閉。

因此,在catch塊內調用Close()並不是一個好主意,因爲這可能會在發生異常時留下一些未釋放的資源。

推薦的方法是將catch塊內調用IClientChannel<T>.Abort()相反,如果Close()會失敗。這裏有一個例子:

try 
{ 
    channel.DoSomething(); 
    channel.Close(); 
} 
catch 
{ 
    channel.Abort(); 
    throw; 
} 

更新:

這裏有一個MSDN文章說describes this recommendation參考。

+0

我是否真的必須關閉頻道?我想打開它,下次我使用它,我檢查是否factory.State!= CommunicationState.Opened(在我的情況下管道工廠),如果是true,則重新創建通道。 – Valentin 2012-07-27 08:42:51

+1

@Valentin簡短的回答是**是**,你應該*在不再需要時明確地發佈WCF頻道。開放的WCF通道包含一些較低級別的資源,例如TCP套接字或HTTP連接。如果您通過將這些資源放置在Gargage Collector的*非確定性手中來延遲發佈這些資源,則可能會遇到它們變得稀缺的情況,從而無法創建新的頻道。 – 2012-07-29 18:18:48

+0

你有沒有提及描述這種推薦改變的文檔? – Macke 2015-01-16 06:49:22