2009-07-05 4 views
28

У меня есть один метод, который получает поток для записи на нем с помощью BinaryWriter. Но когда я распоряжаюсь этим BinaryWriter, он также закрывает поток. Могу ли я оставить его в стороне, чтобы я мог оставить мой поток открытым?Почему BinaryWriter закрывает внешний поток при утилизации и как его предотвратить? (.NET C#)

ответ

10

Просто не вызывайте Dispose, используйте Flush вместо этого, его сейф.

+0

Да, я проверил это на Reflector, и это правда. –

+4

Это безопасно _today_. Собираетесь ли вы использовать Reflector во время выпуска .NET, чтобы убедиться, что он по-прежнему безопасен? Это не решение. -1. –

+2

Это будет всегда безопасно. Просто из-за семантики писателя. Подумайте, почему он распоряжается на данный момент (подскажите посмотреть примеры на msdn). Также обратите внимание, что это не единственное место в .NET, которое неправильно использует IDisposable, например, хорошо знать проблему Dispose с каналами WCF. –

21

В случае BinaryWriter это не прямой вариант (хотя некоторые обтекатели потоков позволяют вам управлять этим, например GZipStream и т. Д.).

У Jon есть NonClosingStreamWrapper в MiscUtil, который должен работать: вы обертываете свой поток в незакрывающей оболочке и даете обертке BinaryWriter. Это существенно проходит через все, кроме Close() и Dispose().

+0

Великая библиотека, хорошая работа! –

+0

Ссылка сломана: http://www.yoda.arachsys.com/csharp/miscutil/ – colithium

+0

Разве вы не думаете, что есть немного взлома? Вы предлагаете изменить поведение (и предположения) BinnaryWriter, обманув его оболочкой? –

9

Защищенный метод BinaryWriter.Dispose (bool) является виртуальным, и все, что он делает, закрывает поток (вы можете проверить, что оно истинно в Reflector). -Этот метод вызывается методом Dispose().

Вы можете просто наследовать класс из BinaryWriter и переопределить метод Dispose (bool), чтобы ничего не делать, или что-то еще все вместе.

47

Начиная с .NET 4.5, класс BinaryWriter имеет новый конструктор, который принимает логический параметр, указывающий, следует ли оставить поток открытым или нет.

Ref: http://msdn.microsoft.com/en-us/library/gg712841.aspx

public BinaryWriter(
    Stream output, 
    Encoding encoding, 
    bool leaveOpen 
) 
+0

Рад, что вы предоставили эту новую информацию. Благодаря! –