InvalidOperationException avec le Processus de
Je commence un nouveau processus en utilisant le code suivant:
Process p = new Process();
p.StartInfo.FileName = "...";
p.StartInfo.Arguments = "...";
p.Start();
p.WaitForExit(300000); //5 minutes
if (!p.HasExited)
p.Kill();
Console.Write(p.ExitCode);
Lorsque le processus se termine dans les 5 minutes, c'est de travailler, mais quand cela ne fonctionne pas, j'obtiens
InvalidOperationException (Processus doit quitter avant de demandé
l'information peut être déterminée...).
Aucune idée de pourquoi je me fais de cette exception?
Merci.
Votre obtenir l'erreur, car le processus doit sortir avant la demande... Est-ce que votre processus? peut-être la peine d'essayer de comprendre pourquoi sa prend plus de temps que vous attendez, d'où l'erreur se produit
Non, ce n'est pas mon processus.
Non, ce n'est pas mon processus.
OriginalL'auteur Morgan M. | 2013-08-01
Vous devez vous connecter pour publier un commentaire.
Selon MSDN, "La
Kill
méthode s'exécute de façon asynchrone. Après l'appel de laKill
méthode, appelez leWaitForExit
méthode à attendre que le processus de sortie, ou de vérifier laHasExited
propriété pour déterminer si le processus a quitté."En d'autres termes, tout simplement parce que
Kill
les retours ne signifie pas que le processus est en fait disparu. Vous aurez besoin de demanderWaitForExit
attendre jusqu'à ce que le processus a en fait disparu.WaitForExit()
, cependant. Seulement unwhile (!process.HasExited) Thread.Sleep(5);
m'a sauvé à la fin. Vous pensez que c'est exactement ce queWaitForExit()
n', mais, apparemment pas.Pourrait être l'un des rares condition de course, c'est à dire le noyau de manière préventive les marques que le processus est sorti avant de terminer le nettoyage.
Bien sûr, si tout le reste échoue, vous pouvez toujours définir un
Int32? exitcode = null;
après lap.WaitForExit()
et ensuite faire unewhile (!exitCode.HasValue)
de la boucle contenant un try-catch qui extrait lap.ExitCode
dans nullable var, captures d'exception InvalidOperationException, et a les 5 millisecondes veille de thread dans lecatch
partie.OriginalL'auteur Drew McGowen
Certaines propriétés d'un Processus (comme hasexited n') peut être déterminé qu'après que le processus de cesser de fumer. D'où l'erreur.
Je suggère d'avoir un bloc try/catch pour obtenir de l'exception qui se passe.
HasExited
était disponible seulement après que le processus a quitter, vous ne pensez pas? Le problème est probablement que Kill() n'est pas une méthode synchrone, etExitCode
n'est pas disponible, à droite après l'appel à elle car le processus n'est en fait pas mort encore.Quel est le point dans le hasexited n'bien si nous ne pouvons l'utiliser lorsque le processus a quitté?
OriginalL'auteur Microsoft DN