如何在NetworkStream上停止阻塞StreamReader.EndOfStream

时间:2011-04-07 10:18:24

标签: c# multithreading locking streamreader networkstream

我更喜欢使用TcpClientThread上进行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 :(得分:0)

你应该中止线程。由于您已经使用try/catch,因此可以优雅地捕获中止线程(导致异常),并且您可以处理关闭流和其他内容的情况。

关于中止一个线程的主要事情(许多人认为它是一个永远不会做的事情),当我们中止它时的线程在哪里以及后果是什么。如果我们可以处理它,就可以中止一个线程。