如何停止阻塞流阅读器.NetworkStream上的EndOfStream
本文关键字:NetworkStream 上的 EndOfStream 何停止 | 更新日期: 2023-09-27 17:49:25
我更喜欢使用TcpClient
, Thread
在NetworkStream
上做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
读取或有一些其他的技术,我可以使用安全(但强制)处置一切?
您应该中止线程。因为你已经使用了try/catch
,中止线程(导致异常)将被优雅地捕获,你可以处理类似关闭流和其他东西的情况。
终止线程(很多人认为这是永远不会做的事情)的主要问题是,当我们终止线程时,线程在哪里以及后果是什么。如果我们可以处理它,就可以中止线程。