Я создаю 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)
«решает» эту проблему, но кажется грязным решением, и многочисленные статьи в Интернете классифицируют это как запах кода.
Итак, что было бы правильным решением?