Поделиться через


Асинхронная обработка канала на стороне клиента

Прежде чем выполнять асинхронный удаленный вызов, клиент должен сначала инициализировать асинхронный дескриптор. Как и в случае с непип-процедурами, клиент вызывает асинхронную функцию с асинхронным дескриптором в качестве первого параметра и использует асинхронный дескриптор для отправки и получения данных канала, запроса состояния вызова и получения ответа.

Клиент выполняет асинхронный вызов удаленной процедуры с асинхронным дескриптором в качестве первого параметра. Клиент может использовать этот дескриптор для запроса состояния вызова и получения ответа. Асинхронная модель канала симметричная. Клиентские и серверные приложения активно отправляют и получают данные канала (в отличие от синхронного RPC, где данные канала отправляются и получаются пассивно).

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

Если флаг RPC_ASYNC_NOTIFY_ON_SEND_COMPLETE установлен в асинхронном дескрипторе и если в качестве механизма уведомления используются APC, APC помещается в очередь после фактического завершения отправки канала. Вы можете воспользоваться преимуществами этого механизма для реализации управления потоком. Однако обратите внимание, что если клиент отправляет другой буфер до завершения предыдущей отправки, клиент может, в зависимости от скорости операции передачи, получить только одно уведомление о завершении отправки, а не одно уведомление для каждого буфера или каждой операции отправки . Когда клиент отправляет все данные канала, он выполняет один окончательный push-вызов с количеством элементов, равным 0.

Клиентская программа получает данные асинхронного канала, вызывая функцию pull в соответствующем асинхронном канале с переменной состояния канала в качестве первого параметра. Если данные канала недоступны, функция pull возвращает RPC_S_ASYNC_CALL_PENDING.

Если механизм уведомления — APC и сервер вернул RPC_S_ASYNC_CALL_PENDING, клиент должен подождать, пока он получит RpcReceiveComplete APC из среды выполнения, прежде чем снова вызвать запрос.