2010-02-19 7 views
4

Pour une raison quelconque, après avoir utilisé un IpcChannel et l'avoir arrêté, le namedpipe reste parfois ouvert, avec un thread en attente. Je ne peux pas faire cela à la demande dans un environnement de débogage, mais cela arrive 5 à 10 fois par jour dans notre environnement de production. Le mauvais effet est que cela m'empêche de décharger l'appdomain car il y a un thread qui attend infiniment sur le pipe nommé (dans une méthode native) ... aucun frame sur la callstack n'est dans mon code - c'est un interne. fil net. Si je lance l'explorateur de processus et trouve la poignée de pipe nommée qui a été laissée ouverte et la ferme de force, alors tout redevient heureux, l'appdomain se décharge bien. Il est possible que je fasse quelque chose de mal car je n'ai pas beaucoup travaillé avec IpcChannels ... mon code côté serveur est ici: http://pastebin.com/f6e2583b9 si quelqu'un veut jeter un coup d'oeil ... ceci est en cours d'exécution sur Server2003 entièrement patché /.NET 2.0. Comme une solution de contournement moche, je pense que je vais suivre tous les canaux que je crée, puis vérifier périodiquement pour s'assurer qu'ils se ferment correctement, puis sur décharger appdomain je vais fermer avec force tous les tuyaux qui restent pendaison .... quelqu'un peut-il me diriger dans la bonne direction quant à la façon dont je pourrais le faire? Je connais le nom de la pipe .... mais je ne suis pas sûr de savoir si elle est encore ouverte, ou comment fermer toutes les poignées existantes ....NET IpcChannel ne nettoie pas correctement correctement?

Répondre

1

oui je l'ai vu avant. une chose similaire peut se produire avec IPC quand le client a encore le canal IPC ouvert - le serveur ne pourra pas le fermer et l'ouvrir de nouveau parce qu'il est déjà utilisé par le client. Pour contourner ces problèmes, il est recommandé de placer TOUTES les créations de canal du serveur IPC dans un domaine AppDomain. puis, lorsque vous souhaitez l'éteindre, vous effectuez simplement les procédures d'arrêt habituelles 'nice' de close() suivies d'un déchargement AppDomain. Cela nuke tout excédent laissé.

il enlèvera toutes les choses liées à IPC aussi bien que lancer le client dans la tête pour monopoliser le canal IPC;)