我更喜欢使用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
中止阅读的推荐方法吗?还是我可以使用其他技术来安全(但强行)处理所有内容?
答案 0 :(得分:0)
你应该中止线程。由于您已经使用try/catch
,因此可以优雅地捕获中止线程(导致异常),并且您可以处理关闭流和其他内容的情况。
关于中止一个线程的主要事情(许多人认为它是一个永远不会做的事情),当我们中止它时的线程在哪里以及后果是什么。如果我们可以处理它,就可以中止一个线程。