Моя корневая проблема - это когда using
вызовы Dispose
на a StreamWriter
, это также располагает BaseStream
(та же проблема с Close
).
У меня есть обходное решение для этого, но как Вы видите, оно включает копирование потока. Там какой-либо путь состоит в том, чтобы сделать это, не копируя поток?
Цель этого состоит в том, чтобы получить содержание строки (первоначально считанный из базы данных) в поток, таким образом, поток может быть считан сторонним компонентом.
NB: я не могу изменить сторонний компонент.
public System.IO.Stream CreateStream(string value)
{
var baseStream = new System.IO.MemoryStream();
var baseCopy = new System.IO.MemoryStream();
using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
{
writer.Write(value);
writer.Flush();
baseStream.WriteTo(baseCopy);
}
baseCopy.Seek(0, System.IO.SeekOrigin.Begin);
return baseCopy;
}
Используемый как
public void Noddy()
{
System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
My3rdPartyComponent.ReadFromStream(myStream);
}
Идеально я ищу мнимый названный метод BreakAssociationWithBaseStream
, например.
public System.IO.Stream CreateStream_Alternate(string value)
{
var baseStream = new System.IO.MemoryStream();
using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
{
writer.Write(value);
writer.Flush();
writer.BreakAssociationWithBaseStream();
}
return baseStream;
}
Если вы используете .NET Framework 4.5 или более поздней версии, существует перегрузка StreamWriter, с помощью которой вы можете запросить базовый поток остается открытым, когда писатель закрыт .
В более ранних версиях .NET Framework до 4.5 StreamWriter
предполагает, что владеет потоком. Параметры:
StreamWriter
; просто промойте это. Close
/ Dispose
, но проксирует все остальное вместе. У меня есть реализация этого в MiscUtil , если вы хотите получить ее оттуда. Просто не вызывайте Dispose
в StreamWriter
. Причина, по которой этот класс является одноразовым, заключается не в том, что он содержит неуправляемые ресурсы, а в том, чтобы разрешить удаление потока, который сам может содержать неуправляемые ресурсы. Если жизнь базового потока обрабатывается где-то еще, нет необходимости удалять писатель.