即使在 using 语句内,我是否应该调用 HttpWebResponse 的 Close 方法?

18

我有一些类似的代码,这段代码被频繁地使用:

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

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

代码今天可以正常工作,但是与服务器的连接保持了相当长的时间。(使用TCPView进行检查)

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


我想这回答了我的问题:https://dev59.com/d3VD5IYBdhLWcg3wO5AD - BlackTigerX
无论最终器是否调用dispose都是一个非常不同的问题。 - Wim Coenen
4个回答

30
当在WebResponse类(HttpWebResponse的基类)上调用Dispose()方法时,它会自动调用其Close()方法。使用反编译器快速查看可以确认这一点。
编辑(回应评论):如果它已经为你调用了,为什么要显式调用它?为了明确吗?我认为,如果人们理解using (X x = ...)语句,他们就会明白它正在关闭底层连接。在这种情况下,显式调用它并没有任何好处。

我知道它会关闭,问题是我是否应该调用 .Close。 - BlackTigerX
你是正确的,“using”调用Dispose,GC调用Finalize。 - BlackTigerX
很酷,很高兴听到这个消息。很抱歉它不是你想要的答案。 - Sean Bright
无法接受两个答案都正确,所以我给了你一个赞,而接受了另一个答案。 - BlackTigerX

18

using关键字是对try/finally语句块的语法糖,它会包装你的HttpWebResponse对象,因为它实现了IDisposable接口。当进入finally语句块时,它将调用Dispose()方法,该方法将调用Close()方法。

这意味着你不必显式调用Close()方法。


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

一个名为“Close”的方法不能实现一个名为“Dispose”的接口成员。它们可以互相调用,但它们是不同的方法。 - harpo
并不完全正确。在VB.NET中,这是完全可能的。只有在C#中(从技术上讲)才不行,尽管可以非常容易地模仿它。 - Noldorin
1
我改正了。https://dev59.com/NW035IYBdhLWcg3wPdkS - harpo

0

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

话虽如此,关闭响应并不一定会关闭连接。HTTP/1.1 协议允许连接保持打开状态,以便更快地进行后续请求。


1
顺便说一句,这个答案的第一句话需要仔细阅读。像其他答案一样,最好先解释一下using会为您执行close - 您不需要自己调用它。一旦您清楚了这一点,那么您就可以理解这句话的意思:如果由于某种原因您想在using块中途关闭(释放资源),那么请继续这样做 - 但更清晰的设计是只保留在使用结果的代码内部 using 块中 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接