Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我';我已经用完了_C#_.net_Wcf_Web Services_Idisposable - Fatal编程技术网

C# 当我';我已经用完了

C# 当我';我已经用完了,c#,.net,wcf,web-services,idisposable,C#,.net,Wcf,Web Services,Idisposable,我试图找出在使用完.net服务引用客户端后是否有必要关闭它。我在网上遇到的几乎所有的例子似乎都不是这样,但是生成的客户端实现了IDisposable,因为它确实打开了一个到服务的连接,我的直觉告诉我,当你完成连接时,你需要关闭该连接 下面是我从中提取的代码示例: 我认为您至少应该在这个方法的末尾调用client.Close(),最好将第一行封装在using语句中。我只是想得到一些关于这方面的反馈,以了解最佳实践是什么。最佳实践是,如果类实现了IDisposable,则在finally子句中调用D

我试图找出在使用完.net服务引用客户端后是否有必要关闭它。我在网上遇到的几乎所有的例子似乎都不是这样,但是生成的客户端实现了IDisposable,因为它确实打开了一个到服务的连接,我的直觉告诉我,当你完成连接时,你需要关闭该连接

下面是我从中提取的代码示例:


我认为您至少应该在这个方法的末尾调用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;
}