我在想,我会不会从这段代码中得到任何未关闭的流:
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的ResponseStream吗?
发布于 2011-09-12 18:53:20
您要么需要关闭响应流,要么需要关闭响应。请注意,关闭包装Stream的StreamReader无论如何都会关闭流,因此第一个版本应该可以。(请注意,我认为“使用Using语句处理”在语义上等同于“在最终块中关闭”-显式调用Close而不是只处理流或响应没有任何好处。)
我相信关闭流已经足够好了--你不需要关闭响应--甚至是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构造函数抛出异常,则它将关闭响应。我不认为这会有任何实际的影响。)
如果你不关闭任何东西,你很容易在将来对同一主机的请求中遇到超时-- " open“响应实质上将占用到该主机的连接,并且在默认情况下,每个主机有两个打开的连接的限制。这是超时的一个非常常见的原因--有很多人因为没有关闭任何东西而超时的问题。
发布于 2011-09-12 18:52:22
没有必要在WebResponse上调用Close方法,但这样做没有什么坏处
http://msdn.microsoft.com/en-us/library/debx8sh9.aspx
https://stackoverflow.com/questions/7386705
复制相似问题