[英]How important is to call dispose on a WCF ChannelFactory<T> and T channel object right after usage?
開發人員喜歡盡可能簡短地編寫代碼。 我們在C#中調用WCF服務,並想知道以下直覺是對還是錯。 使用ChannelFactory
代碼的一種方法是:
var factory = new ChannelFactory<IService>("Endpoint");
var client = factory.CreateChannel();
client.DoSomething();
((IClientChannel)client).Close();
factory.Close();
其他方式(更清潔)是使用包裝器對象(用於工廠和通道)實現IDisposable
,其中兩者都配置並用於使用塊:
using (ServiceWrapper<IService> svcWrapper = new ServiceWrapper<IService>("Endpoint")) {
svcWrapper.Channel.DoSomething();
}
在這里,不得不調用包裝器的屬性對開發人員來說可能有點煩人。 基本上也可能是:
using (ServiceWrapper<IService> svcWrapper = new ServiceWrapper<IService>("Endpoint")) {
IService client = svcWrapper.Channel;
client.DoSomething();
}
(我也發現這篇MSDN文章說使用塊可以隱藏異常)
開發人員可能更喜歡的是:
IService client = new ServiceWrapper<IService>("Endpoint").Channel;
client.DoSomething();
從Nutshell中的C#5.0一書:
一種流行的模式是讓終結器調用Dispose。 當清理非緊急並通過調用來加速它時,這是有道理的。更多的是優化而非必需。
如果我將它添加到我的ServiceWrapper
(C#Finalize / Dispose模式):
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
~ServiceWrapper() {
Dispose(false);
}
然后GC最終會調用Dispose並完成需要完成的事情。 即:
public void Dispose(bool disposing) {
if (disposing) {
if (_channel != null) {
((IClientChannel)_channel).Close();
}
if (_factory != null) {
_factory.Close();
}
_channel = null;
_factory = null;
}
}
我覺得這不適合與WCF ChannelFactory<T>
和T
頻道一起使用,但我沒有一個很好的解釋,它會嚇跑開發人員使用它。 你能解釋一下嗎?
我不能說它不起作用,我試過它並且工作正常。 我看不出任何明顯的性能差異或類似的...我不能給出其他解釋而不是“你不知道何時調用終結器”。 謝謝!
好吧, Dispose
方法唯一做的就是顯式關閉連接。 就這些。 您可以在參考源中看到自己。 此外, ClientBase<T>
,連接的基類也是如此。
也就是說,如果你自己打電話給Close
目前根本沒有實際需要調用Dispose
,雖然我認為你真的應該Dispose
,以便將來證明。 此外,這可能是發生錯誤的故障保護,可能會阻止調用Close
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.