Partager via


Annulation des appels de méthode

Avec l’introduction d’applications distribuées et basées sur le web, le retour de certains appels de méthode peut prendre beaucoup de temps. La latence de la connexion réseau peut être élevée, l’ordinateur serveur peut servir de nombreux clients ou le composant serveur peut transmettre une grande quantité de données, comme un fichier multimédia. Les utilisateurs doivent être en mesure d’annuler une demande qui prend trop de temps, et l’application doit être en mesure de gérer les demandes d’annulation et de poursuivre son autre travail. Dans COM, vous pouvez utiliser l’interface IMessageFilter pour annuler un appel en attente provenant d’un appartement à thread unique.

Lorsqu’un appel est marshalé, le proxy crée un objet cancel, qui implémente l’interface ICancelMethodCalls . L’objet cancel est associé à l’appel et au thread sur lequel l’appel est en attente.

Pour annuler l’appel en attente, le client transmet une demande d’annulation via l’objet cancel, qui gère les détails de la notification de l’objet serveur que l’appel a été annulé. Si la méthode appelée n’a pas retourné, l’objet serveur, lors de la détection de la demande d’annulation, nettoie toutes les ressources de programme qu’il a allouées et avertit son client, en retournant une valeur HRESULT appropriée, qu’il a annulé l’exécution de l’appel. Si la méthode appelée a déjà été retournée, l’objet cancel en avertit le client. Dans les deux cas, le thread client est débloqué et peut continuer le traitement.

La façon dont l’objet serveur répond à une demande d’annulation est à la discrétion de l’implémenteur de serveur, mais le thread appelant sur le client est toujours débloqué et ignore les résultats que le serveur tente de lui transmettre. Les objets Cancel fournissent un moyen de demander l’annulation d’une méthode en cours d’exécution, mais il n’existe aucune garantie que l’objet serveur cesse de traiter l’appel. Par exemple, l’appel a peut-être déjà retourné ou l’objet serveur peut ne pas prendre en charge les objets cancel.

COM fournit automatiquement une implémentation standard d’objets d’annulation pour les objets clients et les interfaces qui utilisent le marshaling standard. Pour les objets et les interfaces qui utilisent le marshaling personnalisé, vous devez implémenter votre propre objet cancel.

À ce stade, les objets Cancel gèrent uniquement les appels synchrones.

Annulation d’un appel asynchrone

CoGetCancelObject

CoSetCancelObject

CoTestCancel