MemoryStream отключает чтение при возврате

В моей программе я в основном читаю файл, обрабатываю его, а затем передаю его в основную программу в качестве запоминающего элемента, который будет обрабатываться программой-streamовым устройством. Все это будет обработано classом рядом с моим главным.

Проблема в том, что, когда я возвращаю stream памяти из моего метода в другом classе, переменная «canread» имеет значение false и, следовательно, приводит к сбою инициализации streamа.

Ниже приведен пример проблемы (хотя здесь я пишу в memystream в другом classе, но он все равно вызывает ту же ошибку, когда я передаю ее обратно.

В classе под названием «Другой class»:

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; } } 

Функция вызывает основную программу:

 MemoryStream MStream = Otherclass.ImportantStreamManipulator(); StreamReader reader = new StreamReader(MStream); 

Когда я ставлю точку останова на «return MemStream», свойство CanRead по-прежнему установлено в true. Как только я перехожу так, чтобы он возвращался к моей основной функции и записывал возвращаемое значение в MStream, для свойства CanRead установлено значение false. Затем это вызывает исключение в StreamReader, говорящее, что MStream не может быть прочитан (как указано в указанном свойстве). Данные находятся в буфере streamов, как и должно быть, но я просто не могу понять это.

Как установить его так, чтобы «CanRead» сообщила об истинности, как только она будет возвращена моей основной? Или я не понимаю, как работает MemoryStream и как я могу выполнить то, что хочу?

    Это проблема:

     using (writer) { //Code that writes stuff to the memorystream via streamwriter return MemStream; } 

    Вы закрываете MemoryStream , которая закрывает MemoryStream . В этом случае вы не хотите этого делать … хотя вам нужно очистить 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; } 

    StreamWriter берет на себя управление streamом памяти, и когда оператор using заканчивается, MemoryStream также закрывается.

    См. Есть ли способ закрыть StreamWriter без закрытия BaseStream? ,

    Как утверждали другие, проблема в том, что Stream закрыт, когда StreamWriter закрыт. Один из возможных способов борьбы с этим – вернуть массив байтов, а не MemoryStream. Это позволяет избежать потенциально длительных объектов, которые должны быть утилизированы сборщиком мусора.

     public static void Main() { OutputData(GetData()); } public static byte[] GetData() { byte[] binaryData = null; using (MemoryStream ms = new MemoryStream()) using (StreamWriter sw = new StreamWriter(ms)) { string data = "My test data is really great!"; sw.Write(data); sw.Flush(); binaryData = ms.ToArray(); } return binaryData; } public static void OutputData(byte[] binaryData) { using (MemoryStream ms = new MemoryStream(binaryData)) using (StreamReader sr = new StreamReader(ms)) { Console.WriteLine(sr.ReadToEnd()); } } 

    Другим методом является копирование streamа в другой stream до возврата. Тем не менее, эта проблема по-прежнему связана с тем, что последующий доступ к ней с помощью StreamReader закроет этот stream.

     public static void RunSnippet() { OutputData(GetData()); } public static MemoryStream GetData() { MemoryStream outputStream = new MemoryStream(); using (MemoryStream ms = new MemoryStream()) using (StreamWriter sw = new StreamWriter(ms)) { string data = "My test data is really great!"; sw.Write(data); sw.Flush(); ms.WriteTo(outputStream); outputStream.Seek(0, SeekOrigin.Begin); } return outputStream; } public static void OutputData(MemoryStream inputStream) { using (StreamReader sr = new StreamReader(inputStream)) { Console.WriteLine(sr.ReadToEnd()); } }