Как остановить блокировку StreamReader.EndOfStream в NetworkStream - PullRequest
1 голос
/ 07 апреля 2011

У меня есть класс, использующий TcpClient, который вращается Thread, делая while (!streamReader.EndOfStream) {} на NetworkStream. Пока TCP-соединение открыто и нет доступных данных для чтения, EndOfStream будет блокировать выполнение, поэтому мне интересно, что мне следует сделать, чтобы прервать чтение извне потока.

Поскольку EndOfStream блокирует, установка частного поля с именем stop в true сама по себе не принесет много пользы (по крайней мере, в моем тестировании), поэтому я сделал следующее:

// Inside the reading thread:

try
{
    StreamReader streamReader = new StreamReader(this.stream);

    while (!streamReader.EndOfStream)
    {
        // Read from the stream
    }
}
catch (IOException)
{
    // If it isn't us causing the IOException, rethrow
    if (!this.stop)
        throw;
}

// Outside the thread:

public void Dispose()
{
    // Stop. Hammer Time!
    this.stop = true;

    // Dispose the stream so the StreamReader is aborted by an IOException.
    this.stream.Dispose();
}

Это рекомендуемый способ прервать чтение из NetworkStream или есть какой-то другой метод, который я могу использовать для безопасного (но принудительного) уничтожения всего?

1 Ответ

0 голосов
/ 07 апреля 2011

Вы должны прервать поток.Поскольку вы уже используете try/catch, прерывание потока (вызывает исключение) будет изящно перехвачено, и вы можете справиться с такой ситуацией, как закрытие потока и другие вещи.

Главное в прерывании потока (многиедумайте об этом как о том, что никогда не надо делать), где нить, когда мы ее прерываем, и каковы последствия.Если мы справимся, то можно прервать поток.

...