Я написал простой клиент, который использует TcpClient в dotnet для связи. Для ожидания сообщений с сервера я использую поток Read()
, который использует блокирующий вызов Read()
для сокета. Когда я что-то получаю, я должен генерировать различные события. Эти события происходят в рабочем потоке, и поэтому вы не можете напрямую обновлять пользовательский интерфейс. Invoke()
можно использовать, но для конечного разработчика это сложно, поскольку мой SDK будет использоваться пользователями, которые вообще не могут использовать пользовательский интерфейс или используют Presentation Framework. У структуры представления есть другой способ справиться с этим. Invoke()
в нашем тестовом приложении Microstation Addin на данный момент занимает много времени. Microstation - это однопоточное приложение, и вызов invoke в его потоке не годится, так как он всегда занят рисованием, а другие сообщения занимают слишком много времени.
Я хочу, чтобы мои события генерировались в том же потоке, что и пользовательский интерфейс, поэтому пользователю не нужно проходить через Dispatcher
или Invoke
.
Теперь я хочу знать, как я могу получать уведомления по сокету при поступлении данных? Есть ли для этого обратный вызов? Мне нравится стиль получения winsock без использования отдельной темы чтения. Я также не хочу использовать таймер окна для опроса данных.
Я обнаружил флаг IOControlCode.AsyncIO
в функции IOControl()
, которая подсказывает:
Включить уведомление, когда данные
в ожидании получения. Это значение
равный Winsock 2 FIOASYNC
постоянная.
Я не смог найти ни одного примера, как использовать его для получения уведомления. Если я прав в MFC / Winsock, мы должны создать окно size(0,0)
, которое просто использовалось для прослушивания события получения данных или других событий сокета. Но я не знаю, как это сделать в приложении dotnet.