我想知道我最终会从这段代码中获得任何未关闭的流:
Public Function [Get](ByVal url As String) As String
Using reader = New System.IO.StreamReader(System.Net.WebRequest.Create(url).GetResponse.GetResponseStream)
Return reader.ReadToEnd
End Using
End Function
这个怎么样:
Public Function Get2(ByVal url As String) As String
Using stream = System.Net.WebRequest.Create(url).GetResponse.GetResponseStream
Using reader = New System.IO.StreamReader(stream)
Return reader.ReadToEnd
End Using
End Using
End Function
基本上,我们是否需要关闭System.Net.WebRequest
的{{1}}?
答案 0 :(得分:7)
您要么需要关闭响应流或,您需要关闭响应。请注意,关闭StreamReader
包裹Stream
将关闭流,因此第一个版本应该没问题。 (注意,我认为“使用Using语句处理”在语义上等于“在finally块中关闭” - 显式调用Close
而不是仅仅处理流或响应没有任何好处。)< / p>
我相信关闭流是足够好的 - 您也不需要关闭响应 - 实际上that's what MSDN states,但我个人为了清晰起见:
Public Function [Get](ByVal url As String) As String
Using response = WebRequest.Create(url).GetResponse
Using reader = New System.IO.StreamReader(response.GetResponseStream)
Return reader.ReadToEnd
End Using
End Using
End Function
(这里有一个理论好处,如果GetResponse
成功返回,它会关闭响应,但GetResponseStream
或StreamReader
构造函数会抛出异常。不要指望有任何实际含义。)
如果你不关闭任何东西,你可能很容易在将来对同一主机的请求中遇到超时 - “开放”响应将基本上占用与该主机的连接,并且默认情况下每台主机有两个开放连接的限制。这是超时的一个非常常见的原因 - 有许多SO问题,人们因为没有关闭任何东西而导致超时。
答案 1 :(得分:2)
没有必要在WebResponse上调用Close方法,但这样做无害