完成使用后,是否需要关闭.NET服务引用客户端

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

这是我从http://msdn.microsoft.com/en-us/library/bb386386(v=VS.90).aspx中提取的代码示例:

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; } 

我认为你至少应该在这个方法结束时调用client.Close(),最好还是在using语句中包装第一行。 我只是希望得到一些反馈,以找出最佳实践。

是的,你这样做,但是这样做时你需要非常小心。 在关闭实现ICommunicationObject的任何内容时,如果通道出现错误或故障,可能会导致对象的处理花费过多的时间。

因此,规定您调用Close方法 ,然后在IDisposable上调用Dispose方法,对某些exception类型使用大量捕获并在最终调用Dispose之前调用Abort

您可以将此逻辑包装在可以在using语句中使用的IDisposable实现中。

这里的关键是创建一个实现IDisposable的令牌,然后在该实现中,调用Close ,捕获相关的exception,调用Abort (如果需要),然后调用Dispose

这是作为一个扩展方法实现的,它在它上面返回一个IDisposable ,这反过来允许你在using语句中使用它。

最佳实践是,如果类实现了IDisposable,则在finally子句中调用Dispose() ,或者using () { }包装它

编辑
在下面的@casperOne评论之后,似乎应该更谨慎地对待WCF客户端。 我不知道这一点,并且有点不安,因为到目前为止使用()已经很好地服务了我。

最好的办法是查看为Dispose()生成的客户端代码,看看它是否真的处理了任何东西,比如HTTP连接等等。

一方面,它可能只是它实现的接口inheritance自IDisposable因为某些客户端可能需要处理某些东西,即使那个特定的东西没有。 这类似于MemoryStream ,这是一个实现IDisposable的类,因为所有Stream都可以,但实际上并不处理任何非托管资源。

另一方面,即使Dispose()是一个空方法,使用它也不会有任何伤害。 MS的例子实际上非常糟糕 ,即使他们应该使用(例如这里 ),所以不要把他们的例子作为你不需要的好证据。