18

我有一些类似的代码,这段代码被大量使用:

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

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

该代码今天运行良好,但与服务器的连接保持打开了相当长的一段时间。(使用 TCPView 检查)

显式调用该Close()方法有好处吗?是推荐还是不推荐,为什么?

4

4 回答 4

30

在(的基类)Dispose()上调用时,它会为您调用它的方法。使用 Reflector 快速浏览一下就证实了这一点。WebResponseHttpWebReponseClose()

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

于 2009-02-02T22:32:20.787 回答
18

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

于 2009-02-02T22:33:31.377 回答
1

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

于 2009-02-02T22:33:05.450 回答
0

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

也就是说,关闭响应并不一定会关闭连接。HTTP/1.1 协议规定连接保持打开状态,以使后续请求更快。

于 2009-02-02T22:33:48.490 回答