MemoryStream - 无法访问已关闭的Stream

Arb*_*æde 53 .net c# asp.net

嗨为什么 using (var sw = new StreamWriter(ms))回来Cannot access a closed Stream exception.Memory Stream在此代码之上.

using (var ms = new MemoryStream())
{
    using (var sw = new StreamWriter(ms))
    {                 
        sw.WriteLine("data");
        sw.WriteLine("data 2");
        ms.Position = 0;
        using (var sr = new StreamReader(ms))
        {
            Console.WriteLine(sr.ReadToEnd());                        
        }
    } //error here
}
Run Code Online (Sandbox Code Playgroud)

什么是解决它的最佳方法?谢谢

Tho*_*mar 83

这是因为在StreamReader处理时自动关闭底层流.该using声明自动执行此操作.

但是,StreamWriter你正在使用的仍在尝试处理流(同样,using编写器的语句现在正试图处理,StreamWriter然后尝试关闭流).

解决此问题的最佳方法是:不要使用using并且不要处理StreamReaderStreamWriter.看到这个问题.

using (var ms = new MemoryStream())
{
    var sw = new StreamWriter(ms);
    var sr = new StreamReader(ms);

    sw.WriteLine("data");
    sw.WriteLine("data 2");
    ms.Position = 0;

    Console.WriteLine(sr.ReadToEnd());                        
}
Run Code Online (Sandbox Code Playgroud)

如果您感觉不好sw并且sr没有被丢弃在代码中(如推荐的那样)进行垃圾收集,您可以执行以下操作:

StreamWriter sw = null;
StreamReader sr = null;

try
{
    using (var ms = new MemoryStream())
    {
        sw = new StreamWriter(ms);
        sr = new StreamReader(ms);

        sw.WriteLine("data");
        sw.WriteLine("data 2");
        ms.Position = 0;

        Console.WriteLine(sr.ReadToEnd());                        
    }
}
finally
{
    if (sw != null) sw.Dispose();
    if (sr != null) sr.Dispose();
}
Run Code Online (Sandbox Code Playgroud)


NtF*_*reX 13

从.net45开始,您可以使用LeaveOpen构造函数参数StreamWriter和stil使用该using语句.

using (var ms = new MemoryStream())
{
    using (var sw = new StreamWriter(ms, Encoding.UTF8, 1024, true))
    {
        sw.WriteLine("data");
        sw.WriteLine("data 2");    
    }

    ms.Position = 0;
    using (var sr = new StreamReader(ms))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Jan,你可以使用 `new StreamWriter(ms, LeaveOpen:true)` 我想这不太难看 (2认同)

its*_*e86 5

当StreamReader的using()结束时,它会处理对象并关闭StreamWriter仍在尝试使用的流.

  • 毫无疑问,我假设为什么OP会问“修复它的最佳方法是什么?” (4认同)
  • 毫无疑问,为什么你一直这么说:-) (2认同)