Clientseitige asynchrone Pipebehandlung
Vor einem asynchronen Remoteaufruf muss der Client zunächst das asynchrone Handle initialisieren. Wie bei Nichtpipeprozeduren ruft der Client eine asynchrone Funktion mit dem asynchronen Handle als ersten Parameter auf und verwendet das asynchrone Handle, um Pipedaten zu senden und zu empfangen, die status des Aufrufs abzufragen und die Antwort zu empfangen.
Der Client führt den asynchronen Remoteprozeduraufruf mit dem asynchronen Handle als ersten Parameter aus. Der Client kann dieses Handle verwenden, um die status des Anrufs abzufragen und die Antwort zu empfangen. Das asynchrone Pipemodell ist symmetrisch. Sowohl Client- als auch Serveranwendungen senden und empfangen Pipedaten aktiv (im Gegensatz zu synchronen RPC, bei dem die Pipedaten passiv gesendet und empfangen werden).
Der Client sendet asynchrone Pipedaten, indem die Pushfunktion für die entsprechende asynchrone Pipe mit der Zustandsvariable der Pipe als ersten Parameter aufgerufen wird. Wenn die Pushfunktion zurückgegeben wird, kann der Client den Sendepuffer ändern oder freigeben.
Wenn das flag RPC_ASYNC_NOTIFY_ON_SEND_COMPLETE im asynchronen Handle festgelegt ist und APCs als Benachrichtigungsmechanismus verwendet werden, wird ein APC in die Warteschlange gestellt, wenn der Pipesendevorgang tatsächlich abgeschlossen ist. Sie können diesen Mechanismus nutzen, um die Ablaufsteuerung zu implementieren. Beachten Sie jedoch, dass, wenn der Client einen anderen Puffer pusht, bevor der vorherige Pushvorgang abgeschlossen ist, der Client je nach Geschwindigkeit des Übertragungsvorgangs nur eine Send-Complete-Benachrichtigung anstelle einer Benachrichtigung für jeden Puffer oder jeden Pushvorgang empfängt. Wenn der Client alle Pipedaten gesendet hat, führt er einen letzten Pushanruf mit der Anzahl der Elemente aus, die auf 0 festgelegt sind.
Das Clientprogramm empfängt asynchrone Pipedaten, indem die Pullfunktion für die entsprechende asynchrone Pipe mit der Statusvariablen der Pipe als ersten Parameter aufgerufen wird. Wenn keine Pipedaten verfügbar sind, gibt die Pullfunktion RPC_S_ASYNC_CALL_PENDING zurück.
Wenn der Benachrichtigungsmechanismus APC ist und der Server RPC_S_ASYNC_CALL_PENDING zurückgegeben hat, muss der Client warten, bis er den RpcReceiveComplete-APC aus der Laufzeit empfängt, bevor er erneut pull aufruft.