Передача потока в функцию и оставление его открытым - PullRequest
1 голос
/ 20 февраля 2020

У меня проблемы с записью в поток. Я думаю, что понимаю почему, но я не совсем понимаю, как обойти эту проблему. См. Пример кода ниже

Требование, чтобы вызывающий модуль Writer в приведенном ниже примере управлял потоком, а не Writer.

это пример кода в вызывающей стороне:

using (Stream stream1 = new MemoryStream())
using (Stream stream2 = new FileStream("ex.txt", FileMode.Create)) 
{
    //example 1:
    Writer writer1 = new Writer();
    writer1.WriteToStream(stream1); 

    //example 2:
    Writer writer2 = new Writer();
    writer2.WriteToStream(stream2);         
}

Это класс Writer: он должен оставлять поток открытым после его завершения.

public class Writer
{
    public void WriteToStream(Stream destination)
    {
        Write(destination, "abc");
    }

    private void Write(Stream destination, string data)
    {
        Streamwriter sw = new StreamWriter(destination);
        sw.Write(data);
    }
}

в этой настройке ничего не отображается в MemoryStream или "ex.txt". Я предполагаю, потому что, как только вы выйдете из метода Write, StreamWriter выйдет из контекста, и поток уйдет с ним, прежде чем он получит возможность записи в файл.
Если я изменю метод Write в приведенном ниже примере, я могу получить что-то, чтобы показать в файле, но поток в конечном итоге закрывается, что противоречит требованию:

private void Write(Stream destination, string data)
{
    using(Streamwriter sw = new StreamWriter(destination))
    {   
        sw.Write(data);
    }
}

Итак, как мне записать строку в поток (Память файла), без закрытия потока в процессе. спасибо

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вам не хватает Stream Flu sh.

Следующее решение этой проблемы:

private void Write(Stream destination, string data)
{
     var sw = new StreamWriter(destination);
     sw.Write(data);
     sw.Flush();
}

Однако открытые потоки печально известны.

0 голосов
/ 21 февраля 2020

Возможно, проще всего использовать конструктор StreamWriter , который позволяет оставить базовый поток открытым и установить для leaveOpen значение true.

private void Write(Stream destination, string data)
{
    using (var sw = new StreamWriter(destination, Encoding.UTF8, 1024, leaveOpen: true))
    {
        sw.Write(data);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...