6

我想知道我最终是否会从此代码中获得任何未关闭的流:

   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'sResponseStream吗?

4

2 回答 2

8

要么需要关闭响应流,要么需要关闭响应。请注意,关闭StreamReader包装 aStream无论如何都会关闭流,所以第一个版本应该没问题。(请注意,我认为“使用 Using 语句处理”在语义上等于“在 finally 块中关闭”——显式调用Close而不是仅仅处理流或响应没有任何好处。)

相信关闭流就足够了——你也不需要关闭响应——这确实是 MSDN 所说的,但为了清楚起见,我个人会这样做:

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构造函数会抛出异常。我不希望这有任何实际意义。)

如果你不关闭任何东西,你很容易在未来对同一主机的请求中遇到超时——“打开”响应基本上会占用与该主机的连接,默认情况下,每个主机限制为两个打开的连接。这是超时的一个非常常见的原因 - 有很多这样的问题,人们因为没有关闭任何东西而超时。

于 2011-09-12T10:53:19.797 回答
2

不必在 WebResponse 上调用 Close 方法,但这样做无害

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

于 2011-09-12T10:52:22.370 回答