我正在构建一个 IRC 客户端,并且想要一个 IRC 独立网络类,它只在客户端和服务器之间发送和接收线路。发送线路是可以的,但我不知道实现监听器线程的好方法。我尝试过的所有方法都有效,但都有我无法解决的缺陷。
我的第一种方法是创建一个StreamReader
被调用的_reader
usingTcpClient.GetStream()
作为基础,然后只做一个_reader.ReadLine()
. 这样做的好处是后台侦听器线程会自动停止,直到收到一行。问题是,当我断开连接并停止侦听器线程(或应用程序刚刚退出)时,我不确定等待的线程ReadLine()
被杀死对于垃圾收集等有多好。线程是否会成为孤立线程并以某种方式留在后台窃取资源?
我的第二种方法是创建一个基于相同的NetworkStream
调用,并创建一个循环来检查它,如果它是错误的,则创建一个while循环,否则将字节推送到一个立即检查并提取任何整行的 StringBuilder 中。这在数据检索方面与 ReadLine 的效果相同,但我不喜欢不断循环。在我的 Core i5 CPU 上,它不需要任何 CPU,但在我功能更强大的 i9 笔记本电脑上,它会不断地窃取一个虚拟 CPU。“解决”了这个问题,但似乎是一个肮脏的修复,互联网上的许多文章将其归类为代码异味。_reader
TcpClient.GetStream()
_reader.DataAvailable
continue
\r\n
_reader.DataAvailable
Thread.Sleep(1)
那么正确的解决方案是什么?