Избежание утилизации основного потока - PullRequest
4 голосов
/ 12 апреля 2010

Я пытаюсь смоделировать некоторые файловые операции.В «реальном» объекте у меня есть:

StreamWriter createFile( string name )
{
  return new StreamWriter( Path.Combine( _outFolder, name ), false, Encoding.UTF8 ) );
}

В фиктивном объекте я бы хотел бы иметь:

StreamWriter createFile( string name )
{
  var ms = new MemoryStream();
  _files.Add( Path.Combine( _outFolder, name ), ms );
  return new StreamWriter( ms, Encoding.UTF8 ) );
}

, где _files - словарь дляхранить созданные файлы для последующей проверки.

Однако, когда потребитель закрывает StreamWriter, он также удаляет MeamoryStream ...: - (

Любые мысли о том, какпреследовать это?

Ответы [ 2 ]

6 голосов
/ 12 апреля 2010

Если вы создадите подкласс MemoryStream, это будет работать, но вам придется вызвать метод ManualDispose, чтобы закрыть основной поток.
Я не уверен, но я думаю, что этот объект будет собирать мусор, когда он выходит из области видимости.

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}

Edit:
Это альтернатива, если вы хотите, чтобы MemoryStream был очищен и готов к чтению сверху.

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
        Flush();
        Seek(0, SeekOrigin.Begin);
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}
3 голосов
/ 12 апреля 2010

Природа StreamWriter заключается в удалении базового потока, когда он сам удаляется. Однако, создав (и вернув) подкласс StreamWriter (я назову его LeakyStreamWriter), вы сможете предотвратить это поведение по умолчанию.

public class LeakyStreamWriter : StreamWriter
{
    public override void Close()
    {
        BaseStream.Close(); //close, but do not dispose
    }

    protected override void Dispose(bool disposing)
    {
        //do nothing here
    }
}

Обратите внимание, что я предполагаю, что StreamWriter не имеет других компонентов для удаления, кроме базового потока, вы можете проверить разборку StreamWriter, чтобы проверить, что на самом деле делается в этих двух методах.

В любом случае, результатом использования вышеуказанного подкласса будет то, что базовый поток будет закрыт, но не утилизирован, когда потоковый писатель закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...