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

Bla*_*erX 18 .net garbage-collection idisposable

我有一些代码,这个代码使用非常多:

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

    /* call r.Close() explicitly? */
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sea*_*ght 28

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

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


Iga*_*nik 16

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


Ant*_*nes 0

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

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