Есть ли способ обнаружения новых данных в TcpClient без опроса? Либо событие, связанное с TcpClient, либо с потоком, используемым для его чтения.
Опрос тратит ресурсы. Поэтому представляется логичным, что где-то есть событие, на которое можно подписаться, чтобы получать уведомления о новых данных, отправляемых сервером. Нет опроса, нет сторонних библиотек и нет неуправляемого кода. Просто простой управляемый встроенный.net. Если TcpClient - неправильный инструмент - это тоже хорошо - для чего это правильный класс?
Просто используйте async IO. Async IO - это метод обратного вызова, который очень похож на событие.
В современном стиле вы бы сказали что-то вроде await myNetworkStream.ReadAsync(...)
. Во время этого вызова нить не блокируется. Если вы впервые слышите об await
это может показаться невозможным, но это правда.
Обратный вызов здесь невидим. В старой схеме APM это хорошо видно:
myNetworkStream.BeginRead(..., asyncResult => { /* callback code */ });
(В этих примерах я предполагаю, что вы получили экземпляр NetworkStream
из своего TcpClient
.