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.