如何停止阻塞流阅读器.NetworkStream上的EndOfStream

本文关键字:NetworkStream 上的 EndOfStream 何停止 | 更新日期: 2023-09-27 17:49:25

我更喜欢使用TcpClient, ThreadNetworkStream上做while (!streamReader.EndOfStream) {}的旋转。只要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读取或有一些其他的技术,我可以使用安全(但强制)处置一切?

如何停止阻塞流阅读器.NetworkStream上的EndOfStream

您应该中止线程。因为你已经使用了try/catch,中止线程(导致异常)将被优雅地捕获,你可以处理类似关闭流和其他东西的情况。

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