【问题标题】:C# Using StreamReader, Disposing of Response StreamC# 使用 StreamReader,处理响应流
【发布时间】:2013-10-07 09:45:22
【问题描述】:

好吧,假设我有一个程序,它发出一个 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();
   }
}

谢谢

【问题讨论】:

标签: c# io resources stream dispose


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当我使用 Visual Studio 2013 的代码分析时,它声称在此处使用两个“使用”会导致 Dispose() 在“响应”中被调用两次,并会生成隐藏的“System.ObjectDisposedException”?

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

    还有其他人看过吗?

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2018-01-29
      • 2010-12-24
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多