Je crée un service Windows qui fonctionne de pair avec d'autres applications. Ces applications démarrent la communication avec le service VIA Remoting. Une fois la connexion établie, je souhaite que les applications arrêtent immédiatement la communication si le service est arrêté. Ce qui signifie que je ne veux pas attendre qu'un Timer se soit écoulé ou qu'il y ait une exception parce que la communication essayait d'utiliser IpcConnection qui n'est plus valide.Comment faire pour WaitForExit() pour le processus externe (Service)
Tout cela fonctionne lorsque le service fonctionne de manière interactive plutôt que comme un service. Quand il fonctionne comme un service, j'ai une exception. Le service s'exécute en tant qu'administrateur, qu'il soit exécuté en tant que service ou en mode interactif. Si j'exécute l'autre application en tant qu'administrateur, cela fonctionne comme prévu. Malheureusement, l'exécution de cette application en tant qu'administrateur ne sera pas une option en production.
Je l'ai réduit à ce qui cause l'exception.
var serverProc = Process.GetProcessById(_remote.ProcessId);
serverProc.WaitForExit();
serverProc
est réussie, mais WaitForExit
échoue.
System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.WaitForExit(Int32 milliseconds)
Je peux remplacer ce code avec un Timer
, mais j'espérais cette technique actuelle fonctionnerait. Est-ce que je fais quelque chose de travail et y a-t-il quelque chose que je puisse faire pour éviter l'exception et utiliser un code similaire?
Ceci est tout à fait normal. Vous devrez être pragmatique, vous ne pouvez pas changer la façon dont la classe Process fonctionne. Et cela doit certainement commencer par votre service en disant adieu, pour que vous n'ayez pas à le découvrir à la dure. Ne fonctionnera toujours pas quand il meurt d'un accident dur. Mais quelque chose d'exceptionnel est arrivé, il devrait générer une exception. –