客户端异步管道处理

在进行异步远程调用之前,客户端必须先初始化异步句柄。 与非pipe 过程一样,客户端调用异步函数,并将异步句柄用作第一个参数,并使用异步句柄发送和接收管道数据、查询调用的状态以及接收回复。

客户端使用异步句柄作为第一个参数进行异步远程过程调用。 客户端可以使用此句柄来查询调用的状态并接收回复。 异步管道模型是对称的。 客户端和服务器应用程序都主动 (发送和接收管道数据,而不是同步 RPC,因为同步 RPC 以被动方式发送和接收管道数据) 。

客户端通过在相应的异步管道上调用 推送 函数来发送异步管道数据,并将管道的状态变量作为第一个参数。 推送函数返回时,客户端可以修改或释放发送缓冲区。

如果在异步句柄中设置了RPC_ASYNC_NOTIFY_ON_SEND_COMPLETE标志,并且将 APC 用作通知机制,则当管道发送实际完成时,APC 将排队。 可以利用此机制来实现流控制。 但请注意,如果客户端在上一个推送完成之前推送另一个缓冲区,则客户端可能会仅收到一个发送完成通知,而不是每个缓冲区或每个 推送 操作的一个通知,具体取决于传输操作的速度。 当客户端发送所有管道数据时,它会进行最后一次 推送 调用,并将元素数设置为 0。

客户端程序通过在相应的异步管道上调用 拉取 函数来接收异步管道数据,并将管道的状态变量作为第一个参数。 如果没有可用的管道数据, 则拉取 函数将返回RPC_S_ASYNC_CALL_PENDING。

如果通知机制为 APC,并且服务器返回RPC_S_ASYNC_CALL_PENDING,则客户端必须等待,直到它从运行时收到 RpcReceiveComplete APC,然后才能再次调用 拉取