首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们需要关闭System.Net.WebRequest的ResponseStream吗?

我们需要关闭System.Net.WebRequest的ResponseStream吗?
EN

Stack Overflow用户
提问于 2011-09-12 18:49:42
回答 2查看 10K关注 0票数 6

我在想,我会不会从这段代码中得到任何未关闭的流:

代码语言:javascript
复制
   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

这样如何:

代码语言:javascript
复制
  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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-12 18:53:20

您要么需要关闭响应流,要么需要关闭响应。请注意,关闭包装StreamStreamReader无论如何都会关闭流,因此第一个版本应该可以。(请注意,我认为“使用Using语句处理”在语义上等同于“在最终块中关闭”-显式调用Close而不是只处理流或响应没有任何好处。)

我相信关闭流已经足够好了--你不需要关闭响应--甚至是that's what MSDN states,但就我个人而言,为了清楚起见,我会这样做:

代码语言:javascript
复制
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构造函数抛出异常,则它将关闭响应。我不认为这会有任何实际的影响。)

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

票数 8
EN

Stack Overflow用户

发布于 2011-09-12 18:52:22

没有必要在WebResponse上调用Close方法,但这样做没有什么坏处

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7386705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档