开发人员喜欢编写尽可能简短的代码。我们在 C# 中调用 WCF 服务,想知道以下直觉是对还是错。
一种使用方式 ChannelFactory
代码是:
var factory = new ChannelFactory<IService>("Endpoint");
var client = factory.CreateChannel();
client.DoSomething();
((IClientChannel)client).Close();
factory.Close();
另一种方式(更简洁)是使用一个实现了 IDisposable
的包装器对象(用于工厂和 channel )在 using block 中配置和使用:
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();
}
(我还发现this MSDN article说using block 可以隐藏异常)
开发人员可能更喜欢的是:
IService client = new ServiceWrapper<IService>("Endpoint").Channel;
client.DoSomething();
摘自《C# 5.0 简而言之》一书:
A popular pattern is to have the finalizer call Dispose. This makes sense when cleanup is non-urgent and hastening it by calling Dispose is more of an optimization than a necessity.
如果我将其添加到我的 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
channel ,但我没有一个很好的解释,这会吓跑开发人员使用它。你们能解释一下吗?
我不能说它不起作用,我试过了,它工作正常。我看不到任何明显的性能差异或类似... 除了“你不知道何时调用终结器。”我无法给出其他解释。 谢谢!
最佳答案
嗯,唯一的事 Dispose
方法确实是显式关闭连接。就这些。您可以在 reference source 中亲自查看.另外, ClientBase<T>
,连接的基类做同样的事情。
就是说,如果您调用 Close
你自己现在没有实际需要调用Dispose
一点也不,尽管我认为你真的应该Dispose
,只是为了证明 future 。这也可以是发生错误时的故障保护,可能会阻止 Close
被调用。
关于c# - 在使用后立即在 WCF ChannelFactory<T> 和 T channel 对象上调用 dispose 有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647453/