我应该在HttpWebResponse上调用Close,即使它在using语句中吗?

时间:2009-02-02 22:28:50

标签: .net garbage-collection idisposable

我有一些代码,这段代码大量使用非常

using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) {
    /* do something with the response */

    /* call r.Close() explicitly? */
}

今天代码工作正常,但与服务器的连接保持打开很长一段时间。 (使用TCPView检查)

明确调用Close()方法有什么好处?是推荐,还是建议不要这样做,为什么?

4 个答案:

答案 0 :(得分:28)

Dispose()WebResponse的基类)上调用HttpWebReponse时,它会为您调用Close()方法。使用Reflector快速浏览确认了这一点。

编辑(回应评论):如果已经为您调用,为什么要明确调用它?为清楚起见?我想如果人们理解using (X x = ...)语句,他们就会理解它正在关闭底层连接。在这种情况下,通过明确地调用它,你什么也得不到。

答案 1 :(得分:16)

using关键字是try/finally块的语法糖,它封装了HttpWebResponse,因为它实现了IDisposable。在finally子句中,它会调用Dispose()方法,该方法将调用Close()。 这意味着您不必显式调用Close()方法。

答案 2 :(得分:1)

我相信Close是实现IDisposable.Dispose的方法,因此肯定不需要事先调用Close方法。这完全是多余的。

答案 3 :(得分:0)

如果您在完成使用响应后在使用中有重要代码,那么确保调用close是正常的。但是,您可能需要考虑重构代码,以便不需要响应的代码不在using块中。

表示关闭响应并不一定会关闭连接。 HTTP / 1.1协议规定连接保持打开状态,以便更快地进行后续请求。