2009-09-14 2 views
0

Я пишу клиентскую программу, которая использует сокеты. Я хотел бы, чтобы клиент получал асинхронно, ЕСЛИ он ожидает ответа, и в этом случае я хотел бы получить синхронно.условный beginReceive

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

Как я мог временно остановить BeginReceive от выполнения? Есть ли способ вызвать EndReceive, а затем, как только я закончил получать синхронно, я могу продолжать получать asnycronously?

+0

Я бы предложил использовать асинхронные ответы для всего, но у вашего асинхронного обработчика получателей есть список ожидающих синхронных запросов и связанных с ними обратных вызовов. Если он видит данные, которые будут выполнять ожидающий синхронный запрос, сделайте соответствующий обратный вызов. Код, который делает синхронный запрос, может затем запрашивать уведомление, когда приходит ответ, и ждать такого уведомления. – supercat

ответ

0

Насколько я знаю, нет способа остановить BeginReceive от закрытия Socket. Чтобы выполнить то, что вы пытаетесь выполнить, вам нужно будет перевести ваши вызовы на использование полностью синхронного и поместить вызовы, которые вы хотите сделать асинхронно, в отдельные потоки. Затем вы будете убивать/приостанавливать поток, если хотите сделать дополнительный вызов. Вы также можете установить свойство ReceiveTimeout на что-то низкое и продолжить цикл, пока он не увидит, что запрос останавливается, например, установка переменной класса.

Просто ради любопытства, почему вы хотите сделать синхронный вызов, если вы уже получаете асинхронно?

+0

Причина, по которой я хотел бы иметь как синхронизацию, так и асинхронный процесс, заключается в том, что мой клиент получает 2 типа сообщений: 1-он запрашивает сервер и ожидает и отвечает, что легче выполнить с помощью приема синхронизации, 2- сервер отправляет неожиданное, но важное сообщение, и в этом случае имеет смысл использовать асинхронный прием. Теперь, если нет возможности объединить два стиля, я должен выполнить шаг 1 в async. Моя проблема иногда возникает, когда мне нужно отправлять несколько команд и ожидать ответов, и сервер может не отвечать быстро что приводит к смешению ответов. – sbenderli

+0

Даже если вы за исключением ответа синхронно, может потребоваться некоторое время, чтобы ответ был полностью принят, даже если он находится в локальной сети. Я также думаю, что вы неправильно понимаете, как работает Read/BeginRead. Когда вы вызываете синхронное чтение, вы говорите, что сокет блокируется до тех пор, пока не будут доступны данные, и когда в буфере TCP будут данные, он будет разблокирован и ваш буфер приема будет заполнен. Но даже если Socket получает информацию, пока у вас нет Read/BeginRead, эти данные будут оставаться в буфере приема, пока вы не вызовете другой Read. – mgbowen

Смежные вопросы