Сокет C # TCP, асинхронное чтение и запись в одно и то же время (.NET CF), как? - PullRequest
1 голос
/ 31 августа 2009

На первый взгляд при использовании асинхронных методов на уровне сокета не должно быть проблем с отправкой и получением данных из соответствующего сетевого потока или «непосредственно» в сокете. Но, вы, наверное, уже знаете, есть.

Проблема особенно подчеркивается на платформе Windows Mobile и Compact Framework .

Я использую асинхронные методы , BeginReceive и функцию обратного вызова, которая выполняет ожидающее асинхронное чтение ожидающих данных (EndReceive) из асинхронного ожидания. результат.

Поскольку мне нужно постоянно получать данные из сокета, существует цикл, который ожидает данные. Проблемы начинаются, когда я хочу отправить данные. Для этого перед отправкой некоторых данных через сокет я «форсирую» завершение асинхронного чтения с помощью EndReceive. На этом есть большая задержка (иногда вы просто не можете дождаться этого таймаута ). Время ожидания слишком велико, и мне нужно немедленно отправить данные . Как? Я не хочу закрывать розетку и заново подключаться.

Я использую синхронный метод Send для отправки данных (хотя результаты совпадают с асинхронными методами BeginSend / EndSend). По окончании отправки я снова начинаю получать данные.

Ресурсы, о которых я знаю:

P.S .: Я пытался отправить данные без завершения асинхронного приема, но затем получил SocketException: В данный момент выполняется операция блокировки (ErrorCode: 10036).

Заранее спасибо! Я надеюсь, что я не одинок в этой «одной маленькой проблеме» .. :)

1 Ответ

1 голос
/ 31 августа 2009

Рассматривали ли вы использовать статический метод Poll (или Select для нескольких сокетов) вместо BeginReceive для проверки наличия данных для чтения? На мой взгляд, это доставляет вам неприятности.

...