2010-05-06 5 views
5

möglicherweise die Umkehrung dieser Frage beendet hat: Process.HasExited returns true even though process is running?C#: Process.HasExited gibt false zurück, auch wenn der Prozess

Ich töte() auf einen Prozess namens und es scheint verlassen zu haben. Aber wenn ich HasExited teste, bekomme ich falsch:

myProcess.Kill(); 

while (!myProcess.HasExited) 
{ 
    Thread.Sleep(1000); 
} 

Und das geht unendlich weiter. Zugegeben, ich muss diesen Code ändern, um schließlich zu warten, aber ich bin neugierig, warum HasExited immer noch false zurückgibt, wenn der Prozess sozusagen von der Karte abgefallen ist.

Antwort

7

Sie leiten die Standardausgabe um? MSDN besagt Folgendes:

Wenn Standardausgabe auf asynchrone Ereignishandler umgeleitet worden ist, ist es möglich, dass die Ausgabeverarbeitung nicht abgeschlossen haben, wenn diese Eigenschaft true zurückgibt. Um sicherzustellen, dass die asynchrone Ereignisbehandlung abgeschlossen wurde, rufen Sie die Überladung WaitForExit() auf, die vor der Überprüfung von HasExited keinen Parameter akzeptiert.

Auf jeden Fall sollte die vorgeschlagene Abhilfe tut möglicherweise den Trick:

myProcess.Kill(); 
myProcess.WaitForExit(); 
+0

Das ist richtig, ich habe die Standardausgabe umleiten. Ich entschied mich dafür, Kill und WaitForExit (1000) in eine Wiederholungsdreieckschleife zu setzen. Ich kann es mir nicht leisten, ewig zu warten, wie der MSDN-Artikel vermuten lässt. – Jeremy

+0

Ich frage mich auch, ob dies bedeutet, dass es für einen Prozess möglich ist, zu beenden und immer noch seine Standard-Ausgabeströme offen zu haben. Oder bedeutet der Artikel, dass mein lokaler Streamreader die Nachricht nicht geschlossen hat, obwohl der Quellprozess beendet wurde? – Jeremy