Comment tuer un processus sans l'obtention d'un “processus a quitté” l'exception"?
- Je utiliser Process.Kill()
pour tuer un processus. Comme ceci:
if( !process.WaitForExit( 5000 ) ) {
process.Kill();
}
et parfois, le processus de sortie à droite, entre les lignes, de sorte que le contrôle à l'intérieur if
et puis Kill
donnera une exception:
System.InvalidOperationException
Cannot process request because the process (ProcessIdHere) has exited.
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.Kill()
//my code here
Maintenant enrouler le code try-catch ne semble pas être une bonne idée parce que InvalidOperationException
peut être appelé pour d'autres raisons.
Est-il un moyen de tuer un processus sans recevoir une exception dans le scénario décrit?
Avez-vous essayé de vérifier l'exception interne? Peut vous donner une exacte exception à traiter.
Yeap, exception interne est nulle en tout temps.
Yeap, exception interne est nulle en tout temps.
OriginalL'auteur sharptooth | 2012-11-26
Vous devez vous connecter pour publier un commentaire.
Vous pourriez P/Invoke
TerminateProcess
passantProcessus.Poignée
. Ensuite manuellement l'évaluation de la cause de celui-ci (GetLastError()
). Ce qui est à peu près, ce queProcess.Kill()
n'en interne.Mais notez que
TerminateProcess
est asynchrone. Donc, vous avez à attendre sur la poignée de processus pour être sûr qu'il est fait.à l'Aide deProcess.Kill()
n'est que pour vous.Mise à jour: Correction,
Process.Kill()
également s'exécute de façon asynchrone. De sorte que vous aurez à utiliserWaitForExit()
attendre pour la résiliation, si vous vous souciez.Franchement, je ne te dérange pas. Bien sûr, il est toujours le (lointain?) chance que certains "arbitraire"
InvalidOperationExcepion
des bulles vers le haut hors de la ligne de code, qui n'est pas lié au processus de ne plus être là ou laProcess
objet à être dans un état non valide, mais en réalité, je pense que vous pouvez simplement aller avec le try/catch autour de laKill
.En outre, en fonction de votre demande, vous pourriez envisager d'enregistrement tuer de toute façon, puisqu'il semble une sorte de dernier ressort. Dans ce cas, le journal le réel
InvalidOperationException
avec elle. Si les choses vont étrange, vous avez au moins vos journaux de vérifier pourquoi leKill
échoué.Avoir tout ce que dit, vous pouvez également envisager de capture de manutention /
Win32Exception
pour les mêmes raisons.OriginalL'auteur
Vous devez utiliser
HasExited
:Voir ici:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx
HasExited
peut retournerfalse
, mais par le tempsKill
exécute, le processus pourrait être passés, résultant en uneInvalidOperationException
encore.Nous parlons d'une fraction de nanoseconde si cela semble peu probable, mais si c'est le cas, vous ne pouvez pas l'arrêter, le meilleur que vous pouvez faire est d'intercepter l'exception.
"Les Fractions de nanosecondes" semble être une exagération, pour être honnête. Votre processus pourrait obtenir preemted, par exemple, entre les deux appels, le diable, la boîte peut même hibernate entre les revenir dans un "malheureux de l'ordre" 😉 Mais je suis d'accord, que la capture de l'exception est le seul "robuste" solution - si vous vous souciez. YMMV de cours.
OK c'est vrai, je voulais simplement dire que c'est une très petite chance. C'est une petite chance non le moins, et doivent être manipulés 🙂
OriginalL'auteur