c# - MemoryStream: impossibile accedere a un flusso chiuso




asp.net .net (4)

Da .net45 puoi usare l'argomento del costruttore di LeaveOpen di StreamWriter e usare l'istruzione 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());
    }
}

Ciao perché restituire using (var sw = new StreamWriter(ms)) restituisce Cannot access a closed Stream exception Cannot access a closed Stream . Memory Stream è in cima a questo codice.

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
}

Qual è il modo migliore per risolverlo? Grazie


Il problema è questo blocco:

using (var sr = new StreamReader(ms))
{
    Console.WriteLine(sr.ReadToEnd());                        
}

Quando StreamReader viene chiuso (dopo aver abbandonato l'utilizzo), chiude anche il flusso sottostante, quindi ora MemoryStream è chiuso. Quando StreamWriter viene chiuso, tenta di svuotare tutto su MemoryStream , ma è chiuso.

Si dovrebbe considerare di non mettere lo StreamReader in un blocco usando.


Quando l'use () per StreamReader sta terminando, sta eliminando l'oggetto e chiudendo il flusso, che StreamWriter sta ancora tentando di utilizzare.


Questo perché StreamReader chiude automaticamente il flusso sottostante quando viene eliminato. L'istruzione using fa automaticamente.

Tuttavia, lo StreamWriter che stai utilizzando sta ancora cercando di funzionare sullo stream (inoltre, l'istruzione using per lo scrittore sta cercando di eliminare StreamWriter , che sta cercando di chiudere lo stream).

Il modo migliore per risolvere questo problema è: non usare e non disporre di StreamReader e StreamWriter . Vedi questa domanda

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

Se ti senti in colpa per sw e sr vengono raccolti da garbage collection senza essere eliminati nel tuo codice (come raccomandato), puoi fare qualcosa del genere:

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




.net