2010-10-17 16 views
3

Je souscrive à un événement WMI et recevoir un "COM objet qui a été séparé de son RCW sous-jacente ne peut pas être utilisé" erreur quand ma demande se ferme. Cette question a été posée before, mais elle est assez différente de ma situation.WMI Exception: "objet COM qui a été séparé de son RCW sous-jacent ne peut pas être utilisé"

J'appelle ce code de mon thread principal:

string strComputer = @"."; 
ManagementScope scope = new ManagementScope(@"\\" + strComputer + @"\root\wmi"); 
scope.Connect(); 

EventQuery query = new EventQuery("Select * from MSNdis_StatusMediaDisconnect"); 

ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query); 

watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); // some function that does stuff when the event occurs. 
watcher.Start(); 

L'événement est signalé correctement. Je soupçonne que le problème est lié à la façon dont ces objets sont libérés lorsque mon application se ferme. Comment puis-je empêcher l'erreur? Dois-je explicitement Disposer de l'observateur, de la portée et de la requête avant la fermeture de mon application?

+1

Extrêmement vieille question, mais puisque c'est le premier hit sur COM RCW je voudrais ajouter que cela arrive souvent lorsque vous fermez une fenêtre avant de disposer de certains objets COM (car ils dépendent implicitement de la poignée de fenêtre). L'ajout d'un code de nettoyage dans l'événement 'Window.OnClosing' peut résoudre ce problème. –

Répondre

5

Eh bien, WMI est COM activé, l'exception n'est pas entièrement mystérieuse. Je suspecte une course dans le finaliseur, essayez de le réparer en appelant la méthode Stop() de l'observateur avant de laisser votre programme se terminer.

+0

J'ai d'abord écarter Dispose et essayé d'arrêter l'observateur, mais l'erreur se produit avant, donc après l'arrêt explicite de l'observateur, l'erreur est résolue! Merci Hans! –