Там какой-либо путь состоит в том, чтобы закрыть StreamWriter, не закрывая его BaseStream?

Моя корневая проблема - это когда 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;
}
107
задан Palec 1 May 2016 в 16:34
поделиться

2 ответа

Если вы используете .NET Framework 4.5 или более поздней версии, существует перегрузка StreamWriter, с помощью которой вы можете запросить базовый поток остается открытым, когда писатель закрыт .

В более ранних версиях .NET Framework до 4.5 StreamWriter предполагает, что владеет потоком. Параметры:

  • Не удалять StreamWriter ; просто промойте это.
  • Создайте оболочку потока, которая игнорирует вызовы Close / Dispose , но проксирует все остальное вместе. У меня есть реализация этого в MiscUtil , если вы хотите получить ее оттуда.
108
ответ дан 24 November 2019 в 03:41
поделиться

Просто не вызывайте Dispose в StreamWriter . Причина, по которой этот класс является одноразовым, заключается не в том, что он содержит неуправляемые ресурсы, а в том, чтобы разрешить удаление потока, который сам может содержать неуправляемые ресурсы. Если жизнь базового потока обрабатывается где-то еще, нет необходимости удалять писатель.

32
ответ дан 24 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: