C# 当我';我已经用完了
我试图找出在使用完.net服务引用客户端后是否有必要关闭它。我在网上遇到的几乎所有的例子似乎都不是这样,但是生成的客户端实现了IDisposable,因为它确实打开了一个到服务的连接,我的直觉告诉我,当你完成连接时,你需要关闭该连接 下面是我从中提取的代码示例:C# 当我';我已经用完了,c#,.net,wcf,web-services,idisposable,C#,.net,Wcf,Web Services,Idisposable,我试图找出在使用完.net服务引用客户端后是否有必要关闭它。我在网上遇到的几乎所有的例子似乎都不是这样,但是生成的客户端实现了IDisposable,因为它确实打开了一个到服务的连接,我的直觉告诉我,当你完成连接时,你需要关闭该连接 下面是我从中提取的代码示例: 我认为您至少应该在这个方法的末尾调用client.Close(),最好将第一行封装在using语句中。我只是想得到一些关于这方面的反馈,以了解最佳实践是什么。最佳实践是,如果类实现了IDisposable,则在finally子句中调用D
我认为您至少应该在这个方法的末尾调用client.Close(),最好将第一行封装在using语句中。我只是想得到一些关于这方面的反馈,以了解最佳实践是什么。最佳实践是,如果类实现了IDisposable,则在
finally
子句中调用Dispose()
,或者用using(){}
将其包装起来
编辑在下面的@casperOne评论之后,似乎应该更加谨慎地对待WCF客户。我不知道这一点,对此我有点不安,因为到目前为止,使用()对我很有用。最好的办法是查看为
Dispose()
生成的客户端代码,看看它是否真的在处理任何东西,比如HTTP连接或其他东西
一方面,它实现的接口可能只是继承自IDisposable
,因为某些客户端可能需要处理某些东西,即使特定的客户端不需要。这与实现IDisposable
的类类似,因为所有Stream
都实现了IDisposable,但实际上并不处理任何非托管资源
另一方面,即使
Dispose()
是一个空方法,使用using
也不会有什么坏处。MS示例实际上不使用而使用是非常糟糕的,即使它们应该使用(例如),所以不要把它们的示例作为你不需要的好证据。是的,你需要,但在这样做时需要非常小心。关闭任何实现该功能的操作时,如果通道上出现错误或故障,则可能会导致处理对象花费过多的时间
因此,规定您先调用,然后在IDisposable
上调用Dispose
方法,对某些异常类型使用大量捕获,并在最终调用Dispose
之前进行调用
您可以将此逻辑封装在IDisposable
实现中,您可以在using
语句中使用该实现
这里的关键是创建一个实现IDisposable
的令牌,然后在该实现中,调用Close
,捕获相关异常,调用Abort
(如果需要),然后调用Dispose
这是作为一个扩展方法实现的,它返回一个IDisposable
,然后允许您在using
语句中使用它。我不明白为什么我找到的所有msdn示例都不这样做。他们不想在他们给出的示例中说明最佳实践吗?你希望如此,但我认为这些示例通常是在展示关于其他类的特定点。我见过一些加密示例,它们对一个文件进行编码,而这个文件甚至没有尝试/捕获文件流实例,我们永远不会这样做,对吗?(!)-1:实现ICommunicationObject的东西不能简单地调用Dispose,原因如下:和这里:-您必须在遇到某些异常时中止,然后调用Dispose。+1:这应该被视为ICommunicationObject实现中的一个bug。我们从什么时候开始容忍使用语句结果出现意外情况的?@slf:我们从2006年WCF发布以来就一直容忍这种情况。这是一个设计缺陷,而不是一个bug。我个人不希望对第三方程序集进行反向工程,看看我是否可以不调用Dispose而侥幸逃脱-这是否会带来风险,即组件或框架的下一个版本,您需要处理并留下一个代码库,将非托管资源清理留给GC?-1:根据实现而不是契约进行编码总是一个坏主意。如果该类型实现IDisposable,则应始终调用Dispose。不这样做的唯一原因是当确定您有特殊情况,并且这样做会损害您的系统,并且需要解决方法时。另外,在MemoryStream的示例中,您应该调用Dispose,因为它不能保证非托管内存将来不会用作后备存储,因此,如果该方面发生更改,您的代码将不会成为未来的证明。@neil,那么请务必调用Dispose();我建议这样做是因为你有实际的代码@casperOne,对接口进行编码通常是一个好主意,但作为一个不灵活的规则,它忽略了类型系统并不完美的事实。例如,非托管内存部分就是一条红鲱鱼:我可以实现IList来使用非托管内存,但是如果用户代码指向IList接口,他甚至不知道自己可以调用Dispose()。-1:永远不要对像WCF这样复杂的东西进行反向工程,然后依赖它。特别是,因为生成的客户机代码并不是在做实际工作,而是基类,它是WCF的一部分。你是说读取生成的代码就是对所有WCF进行反向工程?没有那么多。此外,斜体字的用法已经非常强烈的“总是”和“从不”严重夸大了您的案例。OP问他是否需要接近他的目标,答案是——不管你提出多少工程准则——这取决于代码的内容。
private void button1_Click(System.Object sender, System.EventArgs e)
{
ServiceReference1.Service1Client client = new
ServiceReference1.Service1Client();
string returnString;
returnString = client.GetData(textBox1.Text);
label1.Text = returnString;
}