c# - write - streamreader readline
¿Es correcto no cerrar StreamReader/StreamWriter para mantener abierta la transmisión subyacente? (3)
Tengo una clase que esencialmente envuelve una secuencia para lectura / escritura, pero se espera que esa corriente sea administrada por el consumidor de esa clase. Para facilitar el uso, uso las clases StreamReader y StreamWriter para realizar operaciones de E / S en la transmisión. Normalmente, envolvería al lector y al escritor en el using
bloques, pero quiero evitar cerrar el lector y al escritor porque al hacerlo también se cierra la secuencia subyacente y tengo que mantenerla abierta.
¿Es seguro en términos de administración de recursos / memoria no cerrar un StreamReader / StreamWriter si espero que la corriente subyacente sea administrada por la persona que llama? ¿Se recogerán basura el lector y el escritor cuando el flujo se cierre explícitamente en otro lugar?
public class Wrapper
{
private Stream _underlyingStream;
public Wrapper(Stream underlyingStream)
{
_underlyingStream = underlyingStream;
}
public string GetValue()
{
_underlyingStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(_underlyingStream);
return reader.ReadToEnd(); // we''re done, but the stream is not ours to close
}
}
Definitivamente no está bien. lee esto desde msdn
El cierre llama al método Dispose pasando un valor verdadero. La descarga de la secuencia no descargará su codificador subyacente a menos que llame explícitamente a Cerrar.
Trate de encapsular todo el IO en una clase.
La forma más fácil de resolver esto es envolver la secuencia en su propia clase que se deriva de System.IO.Stream
Ejemplo: http://csharptest.net/browse/src/Library/IO/NonClosingStream.cs
Si nadie cierra los flujos, finalmente se llamará al finalizador, que debería llamar a disposición y cerrarlos en GC. Pero eso es un recurso bastante imprudente, ya que deja los recursos posiblemente costosos asignados hasta GC. Podría empeorar cuanto más tiempo viva su objeto, especialmente si sobrevive a las colecciones para ser promovido a gen 1 o incluso 2.
Seguro que sería bueno si pudiera presentar algo a su interlocutor que aísle esto. ¿Es posible que pueda almacenar en la memoria caché algo de la transmisión de manera que pueda cerrarlo mientras sigue sirviendo el contenido a su interlocutor?
EDITAR después de su edición: Ahora que veo que su interlocutor le PASA una secuencia para operar, ¡mi respuesta tiene que ser diferente! Es muy claro que la persona que llama debe administrar la vida útil de la transmisión. Al principio, tuve la impresión de que su clase creaba un flujo y esperaba que la persona que lo llamó lo lograra.