условное начало

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

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

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


person sbenderli    schedule 14.09.2009    source источник
comment
Я бы предложил использовать асинхронные ответы для всего, но пусть ваш обработчик асинхронного приема хранит своего рода список ожидающих синхронных запросов и связанных обратных вызовов. Если он видит данные, которые учитывают ожидающий синхронный запрос, он должен выполнить связанный обратный вызов. Код, который выполняет синхронный запрос, может затем запросить уведомление, когда поступит ответ, и дождаться такого уведомления.   -  person supercat    schedule 10.02.2014


Ответы (1)


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

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

person Community    schedule 14.09.2009
comment
Причина, по которой я хотел бы иметь как синхронизацию, так и асинхронность, заключается в том, что мой клиент получает 2 типа сообщений: 1 - он что-то запрашивает у сервера и ожидает и отвечает, что легче выполнить с помощью приема синхронизации, 2 - сервер отправляет неожиданное, но важное сообщение, и в этом случае имеет смысл использовать асинхронный прием. Теперь, если нет возможности объединить два стиля, мне придется выполнить шаг 1 в асинхронном режиме. Моя единственная проблема в том, что иногда мне нужно отправить несколько команд и ожидать ответов, и сервер может не отвечать достаточно быстро, что приводит к путанице в ответах - person sbenderli; 15.09.2009
comment
Даже если вы исключите ответ синхронно, для полного получения ответа может потребоваться некоторое время, даже если он находится в локальной сети. Я также думаю, что вы неправильно понимаете, как работает Read / BeginRead. Когда вы вызываете синхронное чтение, вы говорите сокету блокироваться до тех пор, пока не появятся данные, а когда в буфере TCP появятся данные, он разблокируется, и ваш принимающий буфер будет заполнен. Но даже если Socket получает информацию, пока у вас нет Read / BeginRead, эти данные останутся в буфере приема до тех пор, пока вы не вызовете другое Read. - person ; 15.09.2009