Ошибка закрытия потока при использовании синтаксиса "using" - PullRequest
1 голос
/ 20 июня 2011

Я оставлю свой оригинальный вопрос ниже.У меня вопрос, почему следующие строки выдают исключение

(вы можете видеть, что оно выполняется на http://www.ideone.com/rfQLE)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CSQuick
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ff = new MemoryStream())
            using (var f = new StreamWriter(ff))
            {
                f.WriteLine("Hi");
                using (TextReader ts = new StreamReader(ff))
                {
                }
            }
        }
    }
}

Исключение из веб-сайта ideone (возможно, с использованием mono?C #, что вызывает исключение)

Unhandled Exception: System.ObjectDisposedException: The object was used after being disposed.
  at System.IO.MemoryStream.CheckIfClosedThrowDisposed () [0x00000] in <filename unknown>:0 
  at System.IO.MemoryStream.Write (System.Byte[] buffer, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.FlushBytes () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.Flush () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 

Почему я получаю исключение с сообщением "Не удается получить доступ к закрытому потоку."окончательные результаты в темп. ниже должны сделать это, но я не понимаю, как или почему мой поток закрыт?

using (var ff = new MemoryStream())
using (var f = new StreamWriter(ff))
{
    foreach (var t in blah)
    {
        blahblah(t, f);
    }
    ff.Flush()
    using (TextReader ts = new StreamReader(ff))
    {
        temp = ts.ReadToEnd();
        do_a_check(fn, temp);
    }
}//Cannot access a closed Stream.

Ответы [ 4 ]

5 голосов
/ 20 июня 2011

Вы не предоставили много информации, но я предполагаю, что ошибка заключается в том, что, когда условие использования StreamWriter завершено, а StreamWriter закрывается, тогда закрывается и основной поток.В этой ситуации, когда вы попытаетесь получить доступ к потоку после оператора using, вы получите ошибку «Не удается получить доступ к закрытому потоку»

using (var ff = new MemoryStream())
{
using (var f = new StreamWriter(ff))
{
//Some Code
}
//Stream ff is closed, because the StreamWriter has been closed while exiting the inner using statement
}
4 голосов
/ 20 июня 2011

Происходит следующее: когда вы удаляете TextReader, ресурсы в нем также удаляются (MemoryStream).Поэтому, когда StreamWriter удаляется, он сбрасывается, таким образом записывая в удаленный MemoryStream.

Ваш маленький код репро может быть изменен на flush:

    static void Main(string[] args)
    {
        using (var ff = new MemoryStream())
        using (var f = new StreamWriter(ff))
        {
            f.WriteLine("Hi");
            f.Flush();
            using (TextReader ts = new StreamReader(ff))
            {
            }
        }
    }

Или вы можете установить AutoFlush, которыйприведет к сбросу потока при каждой записи, тогда это исключение не будет присутствовать, если вы не поставите строку записи после удаления:

static void Main(string[] args)
{
    using (var ff = new MemoryStream())
    using (var f = new StreamWriter(ff))
    {
        f.AutoFlush = true;
        f.WriteLine("Hi");
        using (TextReader ts = new StreamReader(ff))
        {
        }
    }
}
0 голосов
/ 20 июня 2011

Вы должны показать трассировку стека, которая была бы более полезной.

На данный момент я думаю, что проблема была бы StreamReader в блоке using, который при утилизации закрывает как читатель, так и основной поток

0 голосов
/ 20 июня 2011

В вашем коде это

using (var ff = new MemoryStream())

должно автоматически утилизировать MemoryStream, добавить {} для расширения области действия.Или удалите использующий код и просто добавьте в конце команду try catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...