Wie tötet man einen Prozess, ohne dabei einen "Prozess wurde beendet" Ausnahme?
Benutze ich Process.Kill()
auf Prozess beenden. Wie diese:
if( !process.WaitForExit( 5000 ) ) {
process.Kill();
}
und manchmal der Prozess der Ausfahrt rechts in zwischen den Zeilen, so die Kontrolle wird in if
und dann Kill
wird der Ertrag einer Ausnahme:
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
Nun umwickeln Sie den code in try-catch nicht zu sein scheinen eine gute Idee, weil InvalidOperationException
können aufgerufen werden, aus anderen Gründen.
Gibt es einen Weg, um zu töten einen Prozess, ohne eine Ausnahme in dem beschriebenen Szenario?
- Haben Sie versucht die Kontrolle der inneren Ausnahme? Vielleicht geben Sie die genaue exception zu behandeln.
- Yeap, innere Ausnahme ist null zu allen Zeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie P/Invoke
TerminateProcess
vorbei, es- Prozess.Griff
. Dann manuell die Bewertung der Ursache (GetLastError()
). Das ist ungefähr, wasProcess.Kill()
hat intern.Aber beachten Sie, dass
TerminateProcess
asynchron ist. Also würden Sie warten müssen, um auf den Prozess zu behandeln, um sicherzustellen, dass es fertig ist.MitProcess.Kill()
bedeutet, dass für Ihre.Update: Korrektur
Process.Kill()
läuft auch asynchron. So müssen SieWaitForExit()
zu warten, bis die Kündigung abgeschlossen - wenn Sie Pflege.Ehrlich gesagt, ich würde nicht stören. Natürlich gibt es immer die (entfernte?) die chance, dass einige "willkürlich"
InvalidOperationExcepion
Blasen aus, die Zeile im Quelltext, die nicht im Zusammenhang mit dem Prozess nicht mehr vorhanden oder dieProcess
Objekt in einem ungültigen Zustand, aber in Wirklichkeit ich denke, Sie können gehen Sie einfach mit dem try/catch um dieKill
.Zusätzlich, je nach Anwendung, die Sie könnte erwägen, die Protokollierung dieses töten auf jeden Fall, denn es scheint eine Art last resort Maßnahme. In diesem Fall melden Sie die tatsächliche
InvalidOperationException
mit ihm. Wenn die Dinge seltsam, Sie mindestens haben, Ihre Protokolle zu prüfen, warum dieKill
gescheitert.Dass alles, was gesagt, vielleicht wollen Sie auch zu prüfen, fangen /handling
Win32Exception
aus den gleichen Gründen.Müssen Sie
HasExited
:Siehe hier:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx
HasExited
zurückgeben kannfalse
, sondern durch die ZeitKill
führt, ist der Prozess verschwunden sein könnte - was in einerInvalidOperationException
noch.