IRC クライアントを作成していますが、クライアントとサーバーの間で回線を送受信するだけの IRC に依存しないネットワーク クラスが必要です。回線を送信することは問題ありませんが、リスナー スレッドを実装する良い方法が見つからないのです。私が試したすべての方法は機能しますが、回避できない欠点があります。
私の最初の方法は、ベースとして使用してStreamReader
呼び出されたを作成し、 . これには、回線が受信されるまでバックグラウンド リスナー スレッドが自動的に停止するという利点があります。問題は、リスナー スレッドを切断して停止する (またはアプリケーションが終了する) ときに、待機中のスレッドが強制終了されるだけで、ガベージ コレクションなどにどの程度適しているかがわからないことです。スレッドが孤立して、リソースを盗んでバックグラウンドにとどまる可能性はありますか?_reader
TcpClient.GetStream()
_reader.ReadLine()
ReadLine()
私の 2 番目の方法は、同じ に基づいてNetworkStream
呼び出された を作成し、false の場合は while ループをチェックするループを作成し、それ以外の場合はバイトを StringBuilder にプッシュし、即座にチェックして行全体を抽出することでした。これにより、データの取得時に ReadLine と同じ効果が得られますが、一定のループが好きではありません。私の Core i5 CPU では、CPU を必要としませんが、より強力な i9 ラップトップでは、常に仮想 CPU を盗みます。これを「解決」しますが、汚い修正のように見え、インターネット上の多数の記事がこれをコードの匂いとして分類しています。_reader
TcpClient.GetStream()
_reader.DataAvailable
continue
\r\n
_reader.DataAvailable
Thread.Sleep(1)
では、適切な解決策は何でしょうか?