我有一些代码,这段代码大量使用非常:
using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) {
/* do something with the response */
/* call r.Close() explicitly? */
}
今天代码工作正常,但与服务器的连接保持打开很长一段时间。 (使用TCPView检查)
明确调用Close()
方法有什么好处?是推荐,还是建议不要这样做,为什么?
答案 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协议规定连接保持打开状态,以便更快地进行后续请求。