C#使用StreamReader,处理响应流

时间:2013-10-01 09:32:29

标签: c# io resources stream dispose

好的,假设我有一个程序可以创建一个WebRequest并获取一个WebResponse,并在using语句中使用该WebResponse作为StreamReader,这显然会在之后被处理掉,但WebResponse流呢?例如:

WebResponse response = request.GetResponse();
using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
   x = reader.ReadToEnd();
}

很明显,StreamReader将会被淘汰,并且所有资源都用于它,但是响应中的响应流呢?那样吗?或者我应该这样做:

WebResponse response = request.GetResponse();
using(Stream stream = response.GetResponseStream())
{
   using(StreamReader reader = new StreamReader(stream))
   {
      x = reader.ReadToEnd();
   }
}

由于

2 个答案:

答案 0 :(得分:2)

StreamReader假定您传递给其构造函数的Stream的所有权。换句话说,当您处理StreamReader对象时,它将自动处理您传递的Stream对象。这非常方便,正是您想要的,将代码简化为:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
   x = reader.ReadToEnd();
}

答案 1 :(得分:0)

当我使用Visual Studio 2013的代码分析时,它声称在这里使用两个'usings'将导致Dispose()在'response'上被调用两次并将生成一个隐藏的'System.ObjectDisposedException'?

  

警告CA2202:Microsoft.Usage:可以处理对象'响应'   方法'xxx'不止一次。为了避免产生   System.ObjectDisposedException你不应该调用Dispose   一次在一个物体上。

有没有人见过这个?