Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De procedure voor het maken van een synchrone aanroep is eenvoudig: de client verkrijgt een interfaceaanwijzer op het serverobject en roept methoden aan via die aanwijzer. Asynchrone aanroepen omvat een aanroepobject, dus er zijn nog enkele stappen nodig.
Voor elke methode op een synchrone interface implementeert de bijbehorende asynchrone interface twee methoden. Met deze methoden worden de voorvoegsels Begin_ en Finish_ gekoppeld aan de naam van de synchrone methode. Als een interface met de naam ISimpleStream bijvoorbeeld een leesmethode heeft, heeft de AsyncISimpleStream-interface een Begin_Read en een Finish_Read methode. Om een asynchrone aanroep te starten, roept de client de methode Begin_ aan.
Een asynchrone aanroep starten
Voer een query uit op het serverobject voor de interface ICallFactory. Als QueryInterface E_NOINTERFACE retourneert, biedt het serverobject geen ondersteuning voor asynchrone aanroepen.
Roep ICallFactory::CreateCall aan om een oproepobject te maken dat overeenkomt met de gewenste interface en geef vervolgens de aanwijzer naar ICallFactoryvrij.
Als u geen aanwijzer hebt aangevraagd voor de asynchrone interface van de aanroep naar CreateCall-, voert u een query uit op het aanroepobject voor de asynchrone interface.
Roep de juiste Begin_ methode aan.
Het serverobject verwerkt nu de asynchrone aanroep en de client is vrij om ander werk te doen totdat het de resultaten van de aanroep nodig heeft.
Een aanroepobject kan slechts één asynchrone aanroep tegelijk verwerken. Als dezelfde of een tweede client een Begin_-methode aanroept voordat een asynchrone oproep is voltooid, retourneert de Begin_-methode RPC_E_CALL_PENDING.
Als de client de resultaten van de methode Begin_ niet nodig heeft, kan het aanroepobject aan het einde van deze procedure worden vrijgegeven. COM detecteert deze voorwaarde en schoont de aanroep op. De Finish_-methode wordt niet aangeroepen en de client haalt geen parameters of een retourwaarde op.
Wanneer het serverobject gereed is om terug te keren van de Begin_-methode, geeft het een signaal aan het aanroepobject dat het klaar is. Wanneer de client gereed is, wordt gecontroleerd of het aanroepobject is gesignaleerd. Zo ja, dan kan de client de asynchrone aanroep voltooien.
Het mechanisme voor deze signalering en controle tussen client en server is de ISynchronize interface van het aanroepobject. Normaal gesproken implementeert het aanroepobject deze interface door een door het systeem geleverd synchronisatieobject te aggregeren. Het synchronisatieobject verpakt een gebeurtenisgreep, die de server signaleert net voordat wordt teruggekeerd van de Begin_ methode door ISynchronize::Signalaan te roepen.
Een asynchrone aanroep voltooien
Voer een query uit voor het aanroepobject voor de ISynchronize interface.
Als Wait RPC_E_TIMEOUT retourneert, is de verwerking van de Begin_ methode niet voltooid. De klant kan doorgaan met ander werk en later opnieuw aanroepen. De methode "Finish_" kan niet worden aangeroepen totdat Wait S_OK retourneert.
Als Wait S_OK retourneert, is de methode Begin_ geretourneerd. Roep de juiste Finish_ methode aan.
De methode Finish_ geeft de cliënt eventuele out-parameters door. Het gedrag van de asynchrone methoden, inclusief de retourwaarde van de methode Finish_, moet exact overeenkomen met die van de bijbehorende synchrone methode.
De client kan het aanroepobject vrijgeven zodra de methode Finish_ retourneert, of het kan een aanwijzer naar het aanroepobject bevatten om extra aanroepen uit te voeren. In beide gevallen is de client verantwoordelijk voor het vrijgeven van het aanroepobject wanneer het object niet meer nodig is.
Als u een Finish_ methode aanroept wanneer er geen aanroep wordt uitgevoerd, retourneert de methode RPC_E_CALL_COMPLETE.
Notitie
Als de client- en serverobjecten zich in hetzelfde appartement bevinden, worden aanroepen naar ICallFactory::CreateCall niet gegarandeerd geslaagd. Als het serverobject geen asynchrone aanroepen op een bepaalde interface ondersteunt, mislukt de poging om een aanroepobject te maken en moet de client de synchrone interface gebruiken.
Verwante onderwerpen