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

时间:2010-07-14 13:38:10

标签: c# .net wcf web-services idisposable

我正在尝试找出在完成使用后关闭.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语句中包装第一行。我只是希望得到一些反馈,以找出最佳实践。

3 个答案:

答案 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),所以不要把他们的例子作为你没有的好证据需要。