我正在使用以下方法關閉WCF 4通道。這是正確的做法嗎?正確關閉WCF 4通道的方法
using (IService channel
= CustomChannelFactory<IService>.CreateConfigurationChannel())
{
channel.Open();
//do stuff
}// channels disposes off??
我正在使用以下方法關閉WCF 4通道。這是正確的做法嗎?正確關閉WCF 4通道的方法
using (IService channel
= CustomChannelFactory<IService>.CreateConfigurationChannel())
{
channel.Open();
//do stuff
}// channels disposes off??
儘管不是嚴格衝着通道,你可以這樣做:
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;
}
這曾經是釋放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參考。
我是否真的必須關閉頻道?我想打開它,下次我使用它,我檢查是否factory.State!= CommunicationState.Opened(在我的情況下管道工廠),如果是true,則重新創建通道。 – Valentin 2012-07-27 08:42:51
@Valentin簡短的回答是**是**,你應該*在不再需要時明確地發佈WCF頻道。開放的WCF通道包含一些較低級別的資源,例如TCP套接字或HTTP連接。如果您通過將這些資源放置在Gargage Collector的*非確定性手中來延遲發佈這些資源,則可能會遇到它們變得稀缺的情況,從而無法創建新的頻道。 – 2012-07-29 18:18:48
你有沒有提及描述這種推薦改變的文檔? – Macke 2015-01-16 06:49:22
該響應有點不合適:它提供了ChannelFactory的使用模式,而原始問題涉及該通道。儘管確實(我相信)關閉工廠將關閉其創建的所有通道,但更常見的模式是保持通道工廠處於打開狀態,以便可以高效地創建多個通道。每個通道應該單獨關閉,同時保持工廠的工作。 – 2013-06-06 16:16:30
這是真的 - 謝謝你指出。已調整後發佈 – 2013-06-10 06:53:39
@ÖrjanJämte謝謝已更新 – 2017-03-22 12:56:43