【问题标题】:Do we need to close the System.Net.WebRequest's ResponseStream?我们需要关闭 System.Net.WebRequest 的 ResponseStream 吗?
【发布时间】:2011-09-12 10:49:42
【问题描述】:

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

   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.WebRequestResponseStream吗?

【问题讨论】:

  • 不,你不需要关闭它,使用的是 try{ Stream stream; 的包装器。 ... }catch {..} 最后 { if (stream != null) { stream.Close(); } }
  • @Artur:我认为您误解了这个问题 - 这与您是否需要显式调用 Close 无关,而是关闭 StreamReader(通过 using 语句)是否足以关闭流和网络响应。
  • @Artur: using 最终在对象上调用Dispose(),而不是Close()。释放对象应该关闭打开的资源,但using 不会直接这样做。

标签: .net vb.net stream response system.net


【解决方案1】:

要么需要关闭响应流或者你需要关闭响应。请注意,关闭 StreamReader 包装 Stream 无论如何都会关闭流,所以第一个版本应该没问题。 (请注意,我认为“使用 Using 语句处理”在语义上等于“在 finally 块中关闭” - 显式调用 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 成功返回但GetResponseStreamStreamReader 构造函数抛出异常,它将关闭响应。我不希望这样有任何实际含义。)

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

【讨论】:

  • @Artur:哪个位?我非常清楚 IL 中的 Using 语句意味着什么——我的回答中哪一点与此相反?
【解决方案2】:

WebResponse 上不需要调用 Close 方法,但这样做无害

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

【讨论】:

  • 这样做会暴露出对 C# 语言规范、ECMA 标准的不良知识。同样, using 语句是 try { Stream stream; 的语法 shugar 包装器。 ... } catch {..} 最后 { if (stream != null) { stream.Close(); } } 块。
  • 我同意你的观点,但我只是报告了 MSDN 对此的说法
猜你喜欢
  • 2012-12-19
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多