Как мне “разветвить” поток в .NET?
-
06-07-2019 - |
Вопрос
Как обсуждавшийся ранее, когда BinaryReader или BinaryWriter закрывается, его базовый поток также закрывается (aargh).Рассмотрим эту ситуацию:рутина R
передается ли поток памяти, скажем M
;Я хотел бы написать кое-что для M
а затем передайте его другой подпрограмме для дополнительной обработки (не обязательно записи).Для удобства я бы хотел обернуть M
в BinaryWriter для выполнения моего написания.После написания я закончил с BinaryWriter, но не с M
.
void R(MemoryStream M)
{
using (B = new BinaryWriter(M))
{
// write some stuff using B
}
S(M); // now pass M to another routine for further processing
}
Но я не могу избавиться от BinaryStream без закрытия M
.
Q:Есть ли способ сделать что-либо из следующего?
- извлеките базовый байт[] из потока памяти,
- клонирование потока
- повторно откройте поток после того, как он был закрыт
Решение 4
Благодаря нескольким, кто предложил toArray, я пришел к правильному ответу, который является `M.GetBuffer'.Собрать не так уж плохо, но это
- создает копию
- получает только часть буфера
GetBuffer просто захватывает ссылку на базовый байт[], что мне и нужно.
Другие советы
Вам лучше получить базовый буфер byte[], используя
byte[] buffer = ms.GetBuffer();
А затем скопируйте байтовые данные, используя массив.Метод Copy().Вы можете свободно создавать с его помощью новый поток.
Вы можете использовать такие вещи, как MiscUtil.IO.NonClosingStreamWrapper
в Неправильно использованный, который оборачивает Stream
и просто игнорирует Close
/Dispose
Запросы.Именно с этой целью.
void R(MemoryStream M)
{
using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
{
// write some stuff using B
}
S(M); // now pass M to another routine for further processing
}
Ты можешь:
- Вызовите M.toArray(), чтобы получить поток в виде массива байтов.
- Создайте подкласс BinaryWriter и переопределите метод Dispose, чтобы предотвратить закрытие дочернего потока
Просто чтобы добавить это сюда, очень простым решением было бы не распоряжаться() автором.
void R(MemoryStream M)
{
B = new BinaryWriter(M);
// write some stuff using B
B.Flush();
S(M); // now pass M to another routine for further processing
}
Теперь вам нужно беспокоиться только о сохранении B в области видимости, каковой она будет во время R().
Возможно, это не лучшее решение в данном случае, но стоит отметить, что Читателям и Авторам не нужно Избавляться от себя.
Несколько наивный подход заключается в использовании
byte buf[] = MemoryStream.ToArray();
Скопировать содержимое потока в массив байтов.Вы можете превратить его обратно в поток с помощью
MemoryStream ms = new MemoryStream(buf);
В соответствии с это M.Клон();должно сработать.Но я могу ошибаться...