Событие, когда TcpClient получает данные

1

Есть ли способ обнаружения новых данных в TcpClient без опроса? Либо событие, связанное с TcpClient, либо с потоком, используемым для его чтения.

Опрос тратит ресурсы. Поэтому представляется логичным, что где-то есть событие, на которое можно подписаться, чтобы получать уведомления о новых данных, отправляемых сервером. Нет опроса, нет сторонних библиотек и нет неуправляемого кода. Просто простой управляемый встроенный.net. Если TcpClient - неправильный инструмент - это тоже хорошо - для чего это правильный класс?

  • 0
    Вопрос не относится к ASP.NET или C #. Я рекомендую удалить эти теги.
  • 0
    Дело принято. Но теги помогают ответчикам давать ответы, которые могут работать в этом сценарии (например, возможно, для этого есть специальный класс Asp.net, о котором я не знаю). Я даю в тегах как можно больше информации о сценарии.
Теги:
stream
tcp

1 ответ

3

Просто используйте async IO. Async IO - это метод обратного вызова, который очень похож на событие.

В современном стиле вы бы сказали что-то вроде await myNetworkStream.ReadAsync(...). Во время этого вызова нить не блокируется. Если вы впервые слышите об await это может показаться невозможным, но это правда.

Обратный вызов здесь невидим. В старой схеме APM это хорошо видно:

myNetworkStream.BeginRead(..., asyncResult => { /* callback code */ });

(В этих примерах я предполагаю, что вы получили экземпляр NetworkStream из своего TcpClient.

  • 0
    Спасибо за Ваш ответ. У меня нет опыта ожидания (хотя я слышал об этом). Вы говорите, что он будет ждать до тех пор, пока новая информация не будет записана в поток, и только после этого будет вызывать обратный вызов? Или вы просто говорите, что будет читать без блокировки? Из MSDN - похоже, последний. Который не то, что я ищу.
  • 0
    API асинхронного чтения имеют тот же контракт, что и синхронные. Операция завершается, когда есть доступные данные или когда поток исчерпан .; Чтобы немного скорректировать свой язык: чтение не завершается, когда записываются данные. Считывание завершено, когда данные становятся доступными (когда они поступают). Асинхронное чтение никогда не блокируется (в этом суть), но чтение только завершается, когда данные поступают (или поток заканчивается). Затем будет вызван обратный вызов.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню