我正在構建一個IRC客戶端,並且需要一個IRC獨立網絡類,它只是在客戶端和服務器之間發送和接收線路。發送行是確定的,但是我不知道如何實現一個監聽器線程。我嘗試過的所有方法都有效,但有缺陷,我無法解決。什麼是實施基於行的網絡工作者類的正確方法
我的第一個方法是創建一個StreamReader
使用TcpClient.GetStream()
爲基礎,只是在做一個叫_reader.ReadLine()
_reader
。這樣做的好處是後臺偵聽器線程會自動停止,直到收到一條線。問題是,當我斷開和停止監聽器線程(或應用程序剛剛退出)時,我不確定它有多好,因爲垃圾回收等,線程等待ReadLine()
只是被殺死。該線程是否會成爲孤兒,並以某種方式留在後臺竊取資源?
我的第二個方法是創建基於相同TcpClient.GetStream()
一個NetworkStream
叫_reader
,並創建一個循環,檢查_reader.DataAvailable
和continue
while循環,如果是假的,否則按字節到被立即檢查\r\n
一個StringBuilder並提取任何整行。這與ReadLine在數據檢索方面的效果相同,但我不喜歡常量_reader.DataAvailable
循環。在我的酷睿i5 CPU上,它不需要任何CPU,但是在我的功能更強大的i9筆記本電腦上,它不斷竊取虛擬CPU。 Thread.Sleep(1)
「解決」了這一點,但似乎是一個骯髒的修復,並在互聯網上的許多文章將此分類爲代碼味道。
那麼適當的解決方案是什麼?
我已經看過異步方法,但MSDN文檔 - 尤其是示例代碼 - 充滿了缺陷和錯誤。我還沒有找到一個很好的指導如何使用它們。 – carlsb3rg 2011-04-27 18:43:31
是的。最有用的資源是非託管TCP/IP應用程序。我在[常見問題](http://nitoprograms.blogspot.com/2009/04/tcpip-net-sockets-faq.html)的第2部分有一些指導原則,但它不是教程級材料。 – 2011-04-27 18:57:50
我從不放棄線程。這是後臺線程在應用程序關閉時自動死亡。偵聽循環是'while(tcpClient.Connected){...}'。如果我使用'.ReadLine()',那麼就沒有辦法強制程序繼續執行下一個'while'檢查並優雅地結束循環。這就是爲什麼我想使用NetworkStream方法,因爲我可以在數據不可用時連續循環,並在需要時正常退出。我喜歡你的常見問題。你應該避開常見的FAQ條目。 – carlsb3rg 2011-04-27 20:57:30