2013-08-01 1 views
4

Je commence un nouveau processus en utilisant le code suivant:InvalidOperationException avec processus

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, qui fonctionne, mais quand il ne fait pas, j'obtenir

InvalidOperationException (Le processus doit quitter avant de demander informations peuvent être déterminées ...).

Une idée de pourquoi je reçois cette exception?

Merci.

+0

Vous obtenez l'erreur parce que le processus doit quitter avant reques ... Est-ce votre processus? pourrait être utile de comprendre pourquoi il prend plus de temps que prévu, où se produit l'erreur – Sayse

+0

Non, ce n'est pas mon processus. –

Répondre

10

Selon MSDN, « La méthode Kill exécute de manière asynchrone. Après avoir appelé la méthode Kill, appelez la méthode WaitForExit à attendre que le processus pour quitter, ou vérifier la propriété HasExited pour déterminer si le processus est terminé. » En d'autres termes, le simple fait que Kill renvoie ne signifie pas que le processus a réellement disparu. Vous devrez appeler le WaitForExit pour attendre que le processus ait disparu.

+4

J'ai eu des problèmes avec l'exception qui se produit toujours après 'WaitForExit()', cependant. Seulement un 'while (! Process.HasExited) Thread.Sleep (5);' m'a sauvé à la fin. On pourrait penser que c'est exactement ce que WaitForExit() fait, mais apparemment pas. – Nyerguds

+0

Il peut s'agir d'une condition de concurrence rare, c'est-à-dire que le noyau marque de manière préemptive le processus tel qu'il a été quitté avant la fin du nettoyage. –

+0

Bien sûr, si tout le reste échoue, vous pouvez toujours définir un 'Int32? exitcode = null; 'après le' p.WaitForExit() 'et ensuite faire une boucle while (! exitCode.HasValue)' contenant un try-catch qui récupère le 'p.ExitCode' dans cette variable nullable, attrape seulement InvalidOperationException, et le thread de 5 millisecondes dort dans la partie 'catch'. – Nyerguds

-1

Certaines propriétés d'un processus (telles que HasExited) peuvent être déterminées uniquement après la fermeture du processus. D'où l'erreur.

Je suggère d'avoir un bloc try/catch pour que l'exception se produise.

+2

Ce serait un peu inutile si 'HasExited' était disponible * seulement après que le processus ait quitté *, vous ne pensez pas? Le problème est probablement que Kill() n'est pas une méthode synchrone, et 'ExitCode' n'est pas disponible juste après l'avoir appelé puisque le processus n'est pas encore * mort * pour le moment. – KappaG3

+2

Quel est le point dans la propriété HasExited si nous ne pouvons l'utiliser que lorsque le processus s'est terminé? –

Questions connexes