Saltar al contenido

MemoryStream: no se puede acceder a una secuencia cerrada

Solución:

Esto se debe a que StreamReader cierra el flujo subyacente automáticamente cuando se desecha. los using declaración hace esto automáticamente.

sin embargo, el StreamWriter que está utilizando todavía está intentando trabajar en la transmisión (también, el using declaración para el escritor ahora está tratando de deshacerse de la StreamWriter, que luego intenta cerrar la transmisión).

La mejor forma de solucionar este problema es: no utilice using y no deseche el StreamReader y StreamWriter. Vea esta pregunta.

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

Si te sientes mal por sw y sr siendo recolectado como basura sin ser eliminado en su código (como se recomienda), podría hacer algo como eso:

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

Desde .net45 puede utilizar el LeaveOpen argumento constructor de StreamWriter y todavía usa el using declaración. Ejemplo:

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

Cuando el using() para tu StreamReader está terminando, está desechando el objeto y cerrando el flujo, que su StreamWriter todavía está intentando usar.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *