Estou enviando um fluxo para métodos para escrever e, nesses métodos, estou usando um leitor / roteador binário. Quando o leitor / gravador é descartado, using
ou apenas quando não é referenciado, o fluxo também é fechado?
Eu enviaria um BinaryReader / Writer, mas também estou usando um StreamReader (talvez eu deva contornar isso. Só estou usando isso para GetLine e ReadLine). Isso é bastante problemático se fechar o fluxo toda vez que um escritor / leitor for fechado.
fonte
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.
isso deve ser ignorado? Até agora não recebi nenhuma exceção ...StreamReader
. O aviso parece falso para mim, dado que os documentosIDisposable.Dispose
declaram explicitamente: "Se o método Dispose de um objeto for chamado mais de uma vez, o objeto deverá ignorar todas as chamadas após a primeira. O objeto não deve lançar uma exceção se o método Dispose for chamado várias vezes ".Essa é antiga, mas eu queria fazer algo parecido hoje e descobri que as coisas mudaram. Desde o .net 4.5, existe um
leaveOpen
argumento:O único problema é que não é totalmente óbvio o que definir para os outros parâmetros. Aqui está uma ajuda:
Na página msdn do StreamReader Constructor (Stream):
Isso apenas deixa
detectEncodingFromByteOrderMarks
que, a julgar por código fonte, étrue
Seria bom se alguns desses padrões fossem expostos ou se os argumentos fossem opcionais para que pudéssemos especificar os que queremos.
fonte
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Sim. Você pode verificar isso observando a implementação com o Reflector.
fonte
Seis anos atrasado, mas talvez isso possa ajudar alguém.
O StreamReader fecha a conexão quando é descartada. No entanto, "using (Stream stream = ...) {...}" com StreamReader / StreamWriter pode resultar no descarte do Stream duas vezes: (1) quando o objeto StreamReader é descartado (2) e quando o Stream usando o bloco fecha. Isso resulta em um aviso CA2202 ao executar a análise de código do VS.
Outra solução, tirada diretamente do CA2202 página , é usar um bloco try / finally. Se estiver configurado corretamente, isso fechará a conexão apenas uma vez.
Perto da parte inferior do CA2202 , a Microsoft recomenda o seguinte:
ao invés de...
fonte
Sim. Chamar Dispose () e IDisposable (o que "usar" faz) deve fazer um objeto limpar todos os seus recursos. Isso inclui fluxos liberando e fechando seus descritores de arquivo.
Se, no seu caso, você deseja passá-lo para outros métodos, você precisa garantir que esses métodos não façam a leitura / gravação deles em um bloco de uso.
fonte
Uma maneira fácil de corrigir isso, se necessário, é substituir o método Dispose das classes StreamWriter. Veja meu post aqui para obter o código de como fazê-lo:
A disposição de um StreamWriter fecha o fluxo subjacente?
fonte
o fluxo descartado "usando" a palavra-chave ou chamando descarte explicitamente
fonte