Estoy enviando una secuencia a métodos para escribir, y en esos métodos estoy usando un lector / wrtier binario. Cuando el lector / escritor se deshace, ya sea porusing
o solo cuando no está referenciado, ¿también se cierra la secuencia?
Enviaría un BinaryReader / Writer, pero también estoy usando un StreamReader (tal vez debería evitar eso. Solo lo estoy usando para GetLine y ReadLine). Esto es bastante problemático si cierra la transmisión cada vez que se cierra un escritor / lector.
fuente
CA2202 : Microsoft.Usage : Object 'stream' can be disposed more than once in method '...'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.
¿Debería ignorarse eso? No obtuve ninguna excepción hasta ahora ...StreamReader
. La advertencia me parece falsa, dado que los documentosIDisposable.Dispose
indican explícitamente: "Si se llama al método Dispose de un objeto más de una vez, el objeto debe ignorar todas las llamadas después de la primera. El objeto no debe lanzar una excepción si su método Dispose es llamado varias veces ".Este es viejo, pero quería hacer algo similar hoy y descubrí que las cosas han cambiado. Desde .net 4.5, hay un
leaveOpen
argumento:El único problema es que no es del todo obvio qué establecer para los otros parámetros. Aquí hay algo de ayuda:
Desde la página msdn para StreamReader Constructor (Stream):
Eso solo deja
detectEncodingFromByteOrderMarks
que a juzgar por el código fuente estrue
Sería bueno si algunos de esos valores predeterminados estuvieran expuestos o si los argumentos fueran opcionales para que pudiéramos especificar los que queremos.
fuente
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Sí lo hace Puede verificar esto mirando la implementación con Reflector.
fuente
Seis años tarde pero tal vez esto pueda ayudar a alguien.
StreamReader cierra la conexión cuando se elimina. Sin embargo, "usar (Stream stream = ...) {...}" con StreamReader / StreamWriter puede hacer que Stream se elimine dos veces: (1) cuando el objeto StreamReader está dispuesto (2) y cuando Stream usa el bloque cierra Esto da como resultado una advertencia CA2202 cuando se ejecuta el análisis de código de VS.
Otra solución, tomada directamente del CA2202 página , es usar un bloque try / finally. Configuración correcta, esto solo cerrará la conexión una vez.
Cerca del final de CA2202 , Microsoft recomienda usar lo siguiente:
en vez de...
fuente
Si. Llamar a Dispose () on e IDisposable (que "usar" hace) debería hacer que un objeto limpie todos sus recursos. Esto incluye flujos que descargan y cierran sus descriptores de archivo.
Si, en su caso, desea pasarlo a otros métodos, debe asegurarse de que esos métodos no hagan su lectura / escritura en un bloque de uso.
fuente
Una forma fácil de solucionar esto si es necesario es anular el método Dispose de las clases StreamWriter. Vea mi publicación aquí para ver el código sobre cómo hacerlo:
¿La disposición de StreamWriter cierra la secuencia subyacente?
fuente
la secuencia eliminada ya sea "usando" la palabra clave o llamando a eliminar explícitamente
fuente