Effectuer un appel asynchrone

La procédure d’exécution d’un appel synchrone est simple : le client obtient un pointeur d’interface sur l’objet serveur et appelle des méthodes via ce pointeur. L’appel asynchrone implique un objet d’appel. Il implique donc quelques étapes supplémentaires.

Pour chaque méthode sur une interface synchrone, l’interface asynchrone correspondante implémente deux méthodes. Ces méthodes attachent les préfixes Begin_ et Finish_ au nom de la méthode synchrone. Par exemple, si une interface nommée ISimpleStream a une méthode Read, l’interface AsyncISimpleStream aura une Begin_Read et une méthode Finish_Read. Pour commencer un appel asynchrone, le client appelle la méthode Begin_.

Pour commencer un appel asynchrone

  1. Interrogez l’objet serveur pour l’interface ICallFactory . Si QueryInterface retourne E_NOINTERFACE, l’objet serveur ne prend pas en charge l’appel asynchrone.

  2. Appelez ICallFactory::CreateCall pour créer un objet d’appel correspondant à l’interface souhaitée, puis relâchez le pointeur vers ICallFactory.

  3. Si vous n’avez pas demandé de pointeur vers l’interface asynchrone à partir de l’appel à CreateCall, interrogez l’objet d’appel pour l’interface asynchrone.

  4. Appelez la méthode Begin_ appropriée.

L’objet serveur traite maintenant l’appel asynchrone, et le client est libre d’effectuer d’autres tâches jusqu’à ce qu’il a besoin des résultats de l’appel.

Un objet d’appel ne peut traiter qu’un seul appel asynchrone à la fois. Si le même client ou un deuxième client appelle une méthode Begin_ avant la fin d’un appel asynchrone en attente, la méthode Begin_ retourne RPC_E_CALL_PENDING.

Si le client n’a pas besoin des résultats de la méthode Begin_, il peut libérer l’objet d’appel à la fin de cette procédure. COM détecte cette condition et nettoie l’appel. La méthode Finish_ n’est pas appelée et le client n’obtient pas de paramètres de sortie ou de valeur de retour.

Lorsque l’objet serveur est prêt à retourner à partir de la méthode Begin_, il signale à l’objet d’appel qu’il est terminé. Lorsque le client est prêt, il vérifie si l’objet d’appel a été signalé. Si c’est le cas, le client peut terminer l’appel asynchrone.

Le mécanisme pour cette signalisation et cette vérification entre le client et le serveur est l’interface ISynchronize sur l’objet d’appel. L’objet call implémente normalement cette interface en agrégeant un objet de synchronisation fourni par le système. L’objet de synchronisation encapsule un handle d’événement, que le serveur signale juste avant de retourner à partir de la méthode Begin_ en appelant ISynchronize::Signal.

Pour effectuer un appel asynchrone

  1. Interrogez l’objet d’appel pour l’interface ISynchronize .

  2. Appelez ISynchronize::Wait.

  3. Si Wait retourne RPC_E_TIMEOUT, le traitement de la méthode Begin_ n’est pas terminé. Le client peut continuer avec d’autres travaux et appeler à nouveau Attendre ultérieurement. Il ne peut pas appeler la méthode Finish_ tant que Wait n’a pas retourné S_OK.

    Si Wait retourne S_OK, la méthode Begin_ a été retournée. Appelez la méthode Finish_ appropriée.

La méthode Finish_ transmet au client tous les paramètres sortants. Le comportement des méthodes asynchrones, y compris la valeur de retour de la méthode Finish_, doit correspondre exactement à celui de la méthode synchrone correspondante.

Le client peut libérer l’objet d’appel dès que la méthode Finish_ est retournée, ou il peut contenir un pointeur vers l’objet d’appel pour effectuer des appels supplémentaires. Dans les deux cas, le client est responsable de la libération de l’objet d’appel lorsque l’objet n’est plus nécessaire.

Si vous appelez une méthode Finish_ lorsqu’aucun appel n’est en cours, la méthode retourne RPC_E_CALL_COMPLETE.

Notes

Si les objets client et serveur se trouvent dans le même appartement, la réussite des appels à ICallFactory::CreateCall n’est pas garantie. Si l’objet serveur ne prend pas en charge l’appel asynchrone sur une interface particulière, la tentative de création d’un objet d’appel échoue et le client doit utiliser l’interface synchrone.

 

Annulation d’un appel asynchrone

Sécurité du client pendant un appel asynchrone

Emprunt d’identité et appels asynchrones