2009-06-26 8 views
2

J'écris un serveur COM EXE qui expose une classe qui verrouille une ressource système. En exécution normale, le client libère la ressource (l'exécution de l'exécutable COM se termine quelques secondes plus tard.) En cas d'exécution anormale, l'application cliente se bloque, laissant le serveur com avec une instance ayant un nombre de références positif. minutes jusqu'à la résiliation, ce qui signifie que la ressource système est verrouillée pendant ce tempsDétection de la fin du processus client à partir du serveur COM EXE

Existe-t-il un moyen de détecter instantanément la terminaison du client, comme dans le socket IPC ou le protocole du pilote, sinon il semblerait que COM soit inférieur à d'autres IPC

Répondre

1

J'ai eu la même question il y a quelques années.J'ai trouvé la réponse ici: How To Turn Off the COM Garbage Collection Mechanism.En bref: non, il n'y a aucun moyen de détecter la fin du client instantanél y. Extraits:

Lorsqu'un client COM se termine normalement, il libère toutes les références à son objet serveur . Lorsqu'un client se termine anormalement cependant, peut être des références en suspens à l'objet serveur . Sans un mécanisme de collecte des déchets , le code serveur n'a aucun moyen de savoir quand récupérer les ressources allouées pour l'objet COM , ce qui peut alors provoquer une fuite de ressources . Pour résoudre ce problème , COM met en œuvre un mécanisme de collecte des ordures automatique dans lequel le processus de résolution COM (RPCSS) sur la machine client pings le serveur machine à au nom du processus client .

Alternatives à l'aide du protocole GC de COM (par exemple, en utilisant périodique niveau de l'application « pings » - méthode appels qui informent l'objet que clients sont encore en vie, ou en utilisant un mécanisme de transport sous-jacent tel que TCP keepalives) sont manifestement beaucoup moins efficaces. Par conséquent, le mécanisme par défaut GC DCOM doit être utilisé pour tous les objets qui doivent être arrêtés lorsque leurs clients disparaissent ou se conduisent mal autrement que si ces objets serait effectivement devenir des fuites de mémoire sur le serveur. Le résolveur de la machine serveur conserve la trace des pings pour chaque objet serveur . La période de ping est de 2 minutes et, actuellement, elle est configurable non . Lorsque le résolveur sur le serveur détecte qu'un objet n'a pas été ping pendant 6 minutes, il suppose que tous les clients de l'objet se sont terminés ou ne sont plus utilisant l'objet plus longtemps. Le résolveur va alors publier toutes les références externes à l'objet. Il fait cela en ayant simplement le stub gestionnaire de l'objet (le code d'exécution COM que fournit des appels à chaque objet) appelez :: Release() sur l'interface IUnknown de l'objet. À ce stade, le nombre de références de l'objet sera zéro pour autant que le temps d'exécution COM est concerné.(Il peut encore être des références détenues par les clients locaux (même appartement), de sorte que le nombre de référence interne de l'objet peut à ce stade vont pas nécessairement à zéro.) L'objet peut alors fermé lui-même vers le bas.

NOTE: Collecte des ordures ménagères s'applique à tous les serveurs indépendamment du fait que leurs clients sont local ou à distance, ou une combinaison de local et à distance. Le mécanisme de ping sous-jacente est différent dans le cas local car aucun paquets réseau sont générés, mais pour tous les objectifs pratiques, le comportement est le même.

Questions connexes