Повторное использование потока после завершения метода - PullRequest
0 голосов
/ 09 октября 2011

В настоящее время я работаю над проектом C #, который использует FileStream для открытия файла и передает информацию в StreamReader для его обработки.

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

Когда я смотрю на отладку потока, когда я смотрю на детали о потоке, он говорит, что он не может быть прочитан, ищется или записывается, а параметр длины потока говорит, что возникло исключение типа System.ObjectDisposedException.

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

Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

4 голосов
/ 09 октября 2011

, если ваш streamReader является частью оператора using, он удаляет файловый поток в конце блока оператора.

using (StreamReader reader = new StreamReader(fileStream))
{
      ..
}

Простое решение не состоит в том, чтобы явно распоряжаться читателем, оставляя это GC

[Больше мыслей] Если большинство методов обращаются к потоку файлов через интерфейс TextReader, вы можете передать reader, таким образом избегая проблемы с владельцем.

0 голосов
/ 09 октября 2011

Если я вас правильно понял, ваш поток закрывается слишком быстро.Исходя из того, что вы говорите, это может быть потому, что вы Closing или Disposing StreamReader , который, согласно документации, закроет основной поток.

Попробуйте не закрывать StreamReader (просто игнорируйте его, после того как он не нужен).

Например, если ваш код выглядит следующим образом:

void P()
{
    var stream = new FileStream();
    P1(stream);
    P2(stream);
}

void P1(FileStream stream)
{
    using (var reader = new StreamReader(stream))
    {
      ......
    } //Here you would have disposed StreamReader and close FileStream
}


void P2(FileStream stream) // Stream is already closed
{
}

Вы закрыли свой поток в 1-м методе.У вас будет та же проблема, если вы позвоните:

  • reader.Dispose ();
  • reader.Close ();
  • stream.Dispose ();
  • stream.Close ();
  • using (stream);

Поэтому убедитесь, что ничего из этого не делаете.

Btw: в C # 5 я слышал, что Readers / Writer будет параметризован, если вы хотите затем закрыть базовый поток, когда они закрыты (точно так же, как CryptoStream сейчас)

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