我正在尝试找出在完成使用后关闭.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语句中包装第一行。我只是希望得到一些反馈,以找出最佳实践。
答案 0 :(得分:22)
是的,你这样做,但这样做时你需要非常小心。在关闭任何实现ICommunicationObject
的内容时,如果通道出现错误或错误,可能会导致对象的处理过多。
因此,规定您调用Close
method,然后在Dispose
上调用IDisposable
方法,对某些异常类型使用大量捕获并调用{{3}在你最终致电Dispose
之前。
您可以将此逻辑包装在IDisposable
实现中,您可以在using
语句中使用该实现。
这里的关键是创建一个实现IDisposable
的令牌,然后在该实现中调用Close
,捕获相关的异常,调用Abort
(如果需要)然后调用{ {1}}。
这是作为一种扩展方法实现的,它在其上返回Dispose
,这反过来允许您在IDisposable
语句中使用它。
答案 1 :(得分:4)
最佳做法是,如果该类实现了IDisposable,请在Dispose()
子句中调用finally
,或用using () { }
修改强>
在下面的@casperOne评论之后,似乎应该更谨慎地对待WCF客户端。我不知道这一点,并且对它有点不安,到目前为止使用了()给了我很好的服务。
答案 2 :(得分:-2)
要做的最好的事情是查看生成的Dispose()
客户端代码,看看它是否真的处理了任何事情,比如HTTP连接等等。
一方面,它可能只是因为它实现的接口继承自IDisposable
,因为某些客户端可能需要处理某些东西,即使那个特定的东西没有。这与MemoryStream类似,这是一个实现IDisposable
的类,因为所有Stream
都可以,但实际上并不处理任何非托管资源。
另一方面,即使using
是一个空方法,使用Dispose()
也绝不会受到伤害。并且MS示例实际上非常糟糕关于不使用using
即使它们应该(例如here),所以不要把他们的例子作为你没有的好证据需要。