Я отправляю поток в методы для записи, и в этих методах я использую двоичное устройство чтения / записи. Когда читатель / писатель освобождается, либо using
просто , либо когда на него нет ссылок, поток также закрывается?
Я бы отправил BinaryReader / Writer, но я также использую StreamReader (возможно, мне следует обойти это. Я использую это только для GetLine и ReadLine). Это довольно хлопотно, если он закрывает поток каждый раз, когда писатель / читатель закрывается.
источник
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.
это просто игнорировать? До сих пор я не получил никаких исключений ...StreamReader
. Предупреждение выглядит поддельным для меня, учитывая, что документыIDisposable.Dispose
явно указывают: «Если метод Dispose объекта вызывается более одного раза, объект должен игнорировать все вызовы после первого. Объект не должен вызывать исключение, если его метод Dispose звонил несколько раз.Это старый, но я хотел сделать что-то подобное сегодня и обнаружил, что все изменилось. Начиная с .net 4.5, есть
leaveOpen
аргумент:Единственная проблема заключается в том, что не совсем очевидно, что устанавливать для других параметров. Вот некоторая помощь:
Со страницы msdn для Конструктора StreamReader (Stream):
Это просто оставляет
detectEncodingFromByteOrderMarks
который судя по исходный код являетсяtrue
Было бы хорошо, если бы были выставлены некоторые из этих значений по умолчанию или если аргументы были необязательными, чтобы мы могли просто указать те, которые нам нужны.
источник
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Да, это так. Вы можете убедиться в этом, посмотрев реализацию с помощью Reflector.
источник
Шесть лет спустя, но, может быть, это кому-нибудь поможет.
StreamReader закрывает соединение, когда оно удаляется. Однако «использование (Stream stream = ...) {...}» с StreamReader / StreamWriter может привести к тому, что поток будет удален дважды: (1) когда объект StreamReader удаляется (2) и когда блок Stream используя закрывается. Это приводит к предупреждению CA2202 при выполнении анализа кода VS.
Другое решение, взятое непосредственно со страницы CA2202 , заключается в использовании блока try / finally. Настройте правильно, это только один раз закроет соединение.
В нижней части CA2202 Microsoft рекомендует использовать следующее:
вместо того...
источник
Да. Вызов Dispose () on и IDisposable (что делает «using») должен заставить объект очистить все свои ресурсы. Это включает в себя очистку потоков и закрытие их файловых дескрипторов.
Если в вашем случае вы хотите передать его другим методам, то вам нужно убедиться, что эти методы не выполняют чтение / запись в блоке using.
источник
Простой способ исправить это, если вам нужно, это переопределить метод Dispose классов StreamWriter. Смотрите мой пост здесь для кода о том, как это сделать:
. Утилизация StreamWriter закрывает основной поток?
источник
поток удаляется либо с помощью ключевого слова "using", либо с помощью явного вызова dispose
источник