MemoryStream在返回时禁用读取

Xan*_*ham 9 c# memorystream stream

在我的程序中,我基本上是在读取文件,对其进行一些处理,然后将其作为内存流传递回主程序,这将由流读取器处理.这将全部由我的主要旁边的班级处理.

问题是,当我从另一个类中的my方法返回内存流时,"canread"变量设置为false,从而导致streamreader初始化失败.

下面是一个问题发生的例子(虽然在这里我写的是另一个类中的内存流,但是当我传回它时仍然会导致相同的错误.

在名为"Otherclass"的类中:

public static MemoryStream ImportantStreamManipulator()
{
   MemoryStream MemStream = new MemoryStream();

   StreamWriter writer = new StreamWriter(MemStream);
   using (writer)
   {
       //Code that writes stuff to the memorystream via streamwriter

       return MemStream;
   }
}
Run Code Online (Sandbox Code Playgroud)

函数调用主程序:

MemoryStream MStream = Otherclass.ImportantStreamManipulator();
StreamReader reader = new StreamReader(MStream);
Run Code Online (Sandbox Code Playgroud)

当我在"返回MemStream"上放置一个断点时,"CanRead"属性仍然设置为true.一旦我执行它返回到我的main函数,并将返回的值写入MStream,"CanRead"属性设置为false.然后,这会在StreamReader中导致异常,表示无法读取MStream(如指示的属性).数据应该在流缓冲区中,但我无法理解它.

如何设置它以便"CanRead"在返回主体后报告为真?或者我误解了MemoryStream的工作方式以及如何完成我想做的事情?

Jon*_*eet 25

这就是问题:

using (writer)
{
    //Code that writes stuff to the memorystream via streamwriter

    return MemStream;
}
Run Code Online (Sandbox Code Playgroud)

你关闭了作家,关闭了MemoryStream.在这种情况下,您不希望这样做...虽然您确实需要刷新编写器,然后回放MemoryStream.只需将您的代码更改为:

public static MemoryStream ImportantStreamManipulator()
{
   // Probably add a comment here stating that the lack of using statements
   // is deliberate.
   MemoryStream stream = new MemoryStream();

   StreamWriter writer = new StreamWriter(stream);
   // Code that writes stuff to the memorystream via streamwriter

   writer.Flush();
   stream.Position = 0;
   return stream;
}
Run Code Online (Sandbox Code Playgroud)

  • @KevinBrock:然后它只是垃圾收集,任何缓冲的数据都会丢失.`StreamWriter`没有终结器,AFAIK. (2认同)