Я создаю IRC-клиент и хочу независимый от IRC сетевой класс, который просто отправляет и получает линии между клиентом и сервером.Отправка строк - это нормально, но я не могу найти хороший способ реализации потока слушателя.Все методы, которые я пробовал, работают, но есть недостатки, которые я не могу обойти.
Моим первым методом было создать StreamReader
с именем _reader
, используя TcpClient.GetStream()
в качестве основы, и простоделает _reader.ReadLine()
.Преимущество этого заключается в том, что фоновый поток прослушивания автоматически останавливается до получения строки.Проблема в том, что когда я отключаюсь и останавливаю поток слушателя (или приложение просто завершается), я не уверен, насколько хорошо для сбора мусора и т. Д., Что поток с ожидающим ReadLine()
просто убивается.Может ли поток стать осиротевшим и каким-то образом остаться в фоновом краже ресурсов?
Мой второй метод - создать NetworkStream
с именем _reader
на основе того же TcpClient.GetStream()
и создать цикл, проверяющий _reader.DataAvailable
и continue
цикл while, если он ложный, и в противном случае помещает байты в StringBuilder, который мгновенно проверяется на \r\n
и извлекает все целые строки.Это дает тот же эффект, что и ReadLine при извлечении данных, но мне не нравится постоянный цикл _reader.DataAvailable
.На моем процессоре Core i5 он не требует никакого процессора, но на моем гораздо более мощном ноутбуке i9 он постоянно крадет виртуальный процессор.Thread.Sleep(1)
"решает" это, но выглядит как грязное исправление, и многочисленные статьи в Интернете классифицируют это как запах кода.
Так, каково было бы правильное решение?