Не удается получить доступ к закрытому потоку при передаче потока в другую функцию

Мне нужно передать поток паре функций в другом классе, но он выдает ошибку

Не удается получить доступ к закрытому потоку

Вот код:

первый метод:

Здесь он открывает файл с помощью метода File.Open, а затем создает объект memorystream и копирует FileStream в MemoryStream. затем устанавливает Position в 0 (я установил position в 0, потому что я был в решении, но не помог). Затем он создает объект класса DocxConvert и вызывает метод Converto, передавая ему MemoryStream.

    using (var stream = File.Open(tempPath2, FileMode.Open))
    {
        using(var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                ms.Position = 0;
                using (var docx = new DocxConvert())
                {
                    return docx.Converto(ms);
                }
            }
    }

Класс докксконверт:

Он принимает поток, а затем вызывает метод copyStream, передавая принятый поток.

Метод copyStream в классе DocxConvert: он должен копировать принятый поток в другой поток с именем _memoryStream, который является свойством класса.

    public class DocxConvert
{  

        private MemoryStream _memoryStream = new MemoryStream();

  public bool Converto(Stream stream)
                {
                    try
                    {
                        copyStream(stream);
                        //more code
                    }
                    catch (IOException ex)
                    {
                        Debug.WriteLine(ex);
                    }

                    return true;
                }


       private void copyStream(Stream stream)
        {
            stream.CopyTo(_memoryStream); //here it throws the error
        }
}

пс. Я ищу эту ошибку здесь перед публикацией, но ни одна из тем мне не помогла.

РЕШЕНО путем перезагрузки ПК, код в порядке.


person Ertan Hasani    schedule 05.10.2018    source источник
comment
Я не понимаю, что демонстрирует ваш код. Не могли бы вы создать минимально воспроизводимый пример? В любом случае, если вы получаете это исключение, это потому, что вы закрыли поток в какой-то момент или передали поток методу, который его закрыл.   -  person Llama    schedule 05.10.2018
comment
Похоже, что _memoryStream не открыт во время ошибки.   -  person 500 - Internal Server Error    schedule 05.10.2018
comment
@John, я обновил тему, добавив некоторые объяснения того, что она делает.   -  person Ertan Hasani    schedule 05.10.2018
comment
Однако поток MemoryStream, который вы передаете Convertto, отличается от _memoryStream? Откуда _memoryStream?   -  person Llama    schedule 05.10.2018
comment
@ 500-InternalServerError нет, потому что я также пытался вызвать stream.Position = 0 до этого stream.CopyTo(), и в этой строке возникала ошибка, что означает, что stream по определенной причине не открыт   -  person Ertan Hasani    schedule 05.10.2018
comment
Метод @John Converto принимает тот, который отправляется первым методом в начале. Затем тот же самый передается copyStream, где он пытается скопировать этот принятый поток в свойство класса. Проверьте обновленный код сейчас   -  person Ertan Hasani    schedule 05.10.2018
comment
@John, здесь я сделал небольшую версию кода, чтобы вы могли попробовать сами rextester.com/live /NGMG37032   -  person Ertan Hasani    schedule 05.10.2018


Ответы (1)


Я не знаю о вашем вопросе. Но здесь, в приведенном ниже коде, нет исключений.

    private void button1_Click(object sender, EventArgs e)
    {
        string tempPath2 = Application.StartupPath + "//" + "test.txt";
        using (var stream = File.Open(tempPath2, FileMode.Open))
        {
            using (var ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                ms.Position = 0;

                var docx = new DocxConvert();
                    var isok = docx.Converto(ms);

            }
        }
    }

Ниже указан класс, в котором _memorystream определен вверху.

    MemoryStream _memoryStream = new MemoryStream();
    public bool Converto(Stream stream)
    {
        try
        {
            copyStream(stream);
            //more code
        }
        catch (IOException ex)
        {
          //  Debug.WriteLine(ex);
        }

        return true;
    }
    private void copyStream(Stream stream)
    {
        try
        {
            stream.CopyTo(_memoryStream); 
        }
        catch (Exception)
        {


        }

    }
person LDS    schedule 05.10.2018
comment
Спасибо. Все, что я сделал, это перезагрузил компьютер, и теперь он работает. Не знал, почему это даже произошло - person Ertan Hasani; 05.10.2018
comment
ОК Спасибо и наслаждайтесь - person LDS; 05.10.2018