У меня есть один метод, который получает поток для записи на нем с помощью BinaryWriter. Но когда я распоряжаюсь этим BinaryWriter, он также закрывает поток. Могу ли я оставить его в стороне, чтобы я мог оставить мой поток открытым?Почему BinaryWriter закрывает внешний поток при утилизации и как его предотвратить? (.NET C#)
ответ
Просто не вызывайте Dispose, используйте Flush вместо этого, его сейф.
В случае BinaryWriter
это не прямой вариант (хотя некоторые обтекатели потоков позволяют вам управлять этим, например GZipStream
и т. Д.).
У Jon есть NonClosingStreamWrapper в MiscUtil, который должен работать: вы обертываете свой поток в незакрывающей оболочке и даете обертке BinaryWriter
. Это существенно проходит через все, кроме Close()
и Dispose()
.
Великая библиотека, хорошая работа! –
Ссылка сломана: http://www.yoda.arachsys.com/csharp/miscutil/ – colithium
Разве вы не думаете, что есть немного взлома? Вы предлагаете изменить поведение (и предположения) BinnaryWriter, обманув его оболочкой? –
Защищенный метод BinaryWriter.Dispose (bool) является виртуальным, и все, что он делает, закрывает поток (вы можете проверить, что оно истинно в Reflector). -Этот метод вызывается методом Dispose().
Вы можете просто наследовать класс из BinaryWriter и переопределить метод Dispose (bool), чтобы ничего не делать, или что-то еще все вместе.
Начиная с .NET 4.5, класс BinaryWriter имеет новый конструктор, который принимает логический параметр, указывающий, следует ли оставить поток открытым или нет.
Ref: http://msdn.microsoft.com/en-us/library/gg712841.aspx
public BinaryWriter(
Stream output,
Encoding encoding,
bool leaveOpen
)
Рад, что вы предоставили эту новую информацию. Благодаря! –
Да, я проверил это на Reflector, и это правда. –
Это безопасно _today_. Собираетесь ли вы использовать Reflector во время выпуска .NET, чтобы убедиться, что он по-прежнему безопасен? Это не решение. -1. –
Это будет всегда безопасно. Просто из-за семантики писателя. Подумайте, почему он распоряжается на данный момент (подскажите посмотреть примеры на msdn). Также обратите внимание, что это не единственное место в .NET, которое неправильно использует IDisposable, например, хорошо знать проблему Dispose с каналами WCF. –