Ich benutze Process. Start, um eine Batch-Datei zu starten. Die Batchdatei verwendet den START-Befehl, um mehrere Programme parallel zu starten und dann zu beenden. Sobald die Batchdatei fertig ist, wird Process. HasExited wahr und Process. ExitCode enthält den korrekten Exit-Code. Aber wenn ich Process. WaitForExit () anrufe, hängt es niemals zurück. Das folgende Stück Code zeigt das Problem. Es schafft eine Batch-Datei, startet sie und druckt dann: Es sollte dann drucken: aber es tut es nie (obwohl HasExited wahr ist und wir bereits einen ExitCode haben). Ich habe festgestellt, dass dies nur geschieht, wenn die Batch-Datei START-Befehle enthält und wenn Standard-Ausgabe und Standard-Fehler umgeleitet werden. Warum kommt WaitForExit () niemals zurück Was ist der richtige Weg, um auf einen solchen Prozess zu warten, um zu beenden ist es sicher, nur abzufragen Process. HasExited oder kann das Ergebnis in anderen Problemen PS. Ich habe gerade bemerkt, dass das Aufrufen von WaitForExit (100000) mit einem riesigen Timeout (das definitiv nicht abläuft) sofort zurückkehrt, wenn der Prozess beendet wird. Wierd Ohne Zeitüberschreitung hängt es. Es gibt einen grundlegenden Unterschied, wenn Sie WaitForExit () ohne Time-out anrufen, es sorgt dafür, dass die umgeleiteten stdouterr EOF zurückgegeben haben. Dies stellt sicher, dass Sie alle Ausgaben lesen, die durch den Prozess produziert wurden. Wir können sehen, was quotonOutputquot tut, aber hohe Chancen, dass es Deadlocks Ihr Programm, weil es etwas böse wie vorausgesetzt, dass Ihr Haupt-Thread ist im Leerlauf, wenn es tatsächlich in WaitForExit () stecken ist. Ndash Hans Passant Dies ist ein Artefakt (Id say Bug) in der spezifischen Implementierung der ereignisbasierten asynchronen Handhabung von StandardOutput und StandardError. Deutsch:. Englisch: v3.espacenet. com/textdoc? DB = EPODOC & ... PN = Ich bemerkte, dass, während ich konnte in der Lage, leicht zu reproduzieren Ihr Problem, einfach durch den Betrieb der Code, den Sie zur Verfügung gestellt (ausgezeichnetes Codebeispiel, übrigens.)), Der Prozess nicht wirklich hängen unendlich. Vielmehr kehrte es von WaitForExit zurück (), sobald beide Kinderprozesse, die begonnen hatten, sich selbst verlassen hatten. Dies scheint ein absichtlicher Teil der Implementierung der Prozessklasse zu sein. Insbesondere in der Process. WaitForExit () - Methode, sobald es das Warten auf den Prozess-Handle selbst beendet hat, prüft es, ob ein Leser für entweder Stdout oder Stderr erstellt wurde, wenn ja, und wenn der Timeout-Wert für die WaitForExit ( ) Aufruf ist unendlich (dh -1), der Code wartet tatsächlich auf den End-of-Stream auf den Leser (s). Jeder Leser wird nur erstellt, wenn die BeginOutputReadLine () oder BeginErrorReadLine () - Methode aufgerufen wird. Die Stdout - und Stderr-Ströme sind selbst nicht geschlossen, bis die Kinderprozesse geschlossen sind. So warten auf das Ende dieser Ströme wird blockieren, bis das passiert. Dass WaitForExit () sich je nachdem, ob man entweder die Methoden angerufen hat, die das ereignisbasierte Lesen der Streams anfangen oder nicht, verhalten werden, und vor allem, dass das Lesen dieser Ströme direkt nicht dazu führt, dass WaitForExit () sich so verhält, schafft es Eine Inkonsistenz in der API, die es viel schwieriger zu verstehen und zu verwenden macht. Während Id persönlich dies einen Bug nennen, nehme ich an, dass es möglich ist, dass der / die implementierer (n) der Prozessklasse sich dieser Inkonsistenz bewusst ist und sie absichtlich erstellt hat. In jedem Fall wäre das Work-around, StandardOutput und StandardError direkt zu lesen, anstatt den ereignisbasierten Teil der API zu verwenden. (Obwohl natürlich der Code auf diese Streams warten sollte, würde man das gleiche Blockierverhalten sehen, bis das Kind sich verläuft.) Zum Beispiel (C, weil ich nicht gut genug weiß, um ein Codebeispiel wie dieses zusammen schnell zu schlagen :)): Hoffentlich wird das oben genannte Work-around oder etwas ähnliches das grundlegende Problem, das du dir eingeleitet hast. Mein Dank an Kommentator Niels Vorgaard Christensen für die Leitung mich auf die problematischen Linien in der WaitForExit () - Methode, so dass ich diese Antwort zu verbessern. Es sollte kein Unterschied in diesem zwischen einem Multi-Prozessor-Maschine und einem einzigen Prozessor-Maschine. Dies ist wahrscheinlich eher eine Frage des Prozesses verwendet, um. txt Dateien auf den beiden Maschinen zu öffnen. Wenn das gleiche Programm verwendet wird, um die Datei zu bearbeiten, sollte es das gleiche Verhalten haben. Reed Copsey, Jr. - Reedcopsey Wenn ein Beitrag Ihre Frage beantwortet, klicken Sie bitte auf "Mark As Answer" auf diesem Post und klicken Sie auf "Mark as Helpful". Vorgeschlagen als Antwort von Carl Daniel Moderator Donnerstag, November 10, 2011 8:29 AM Markiert als Antwort von Paul Zhou Mittwoch, November 16, 2011 4:26 AM Dienstag, November 08, 2011 5:43 PM Es sollte keinen Unterschied in diesem Zwischen einer Multiprozessor-Maschine und einer einzigen Prozessormaschine. Dies ist wahrscheinlich eher eine Frage des Prozesses verwendet, um. txt Dateien auf den beiden Maschinen zu öffnen. Wenn das gleiche Programm verwendet wird, um die Datei zu bearbeiten, sollte es das gleiche Verhalten haben. Reed Copsey, Jr. - Reedcopsey Wenn ein Beitrag Ihre Frage beantwortet, klicken Sie bitte auf "Mark As Answer" auf diesem Post und klicken Sie auf "Mark as Helpful". Vorgeschlagen als Antwort von Carl Daniel Moderator Donnerstag, November 10, 2011 8:29 AM Als Antwort von Paul Zhou markiert Mittwoch, November 16, 2011 4:26 AM Ich habe Ihren Code in einem getestet Einfache WinForm Anwendung. Ich füge eine Schaltfläche in das Formular hinzu und füge deinen Code in das Buttonclick-Event ein. Wenn ich es laufe, bevor die geöffnete Textdatei geschlossen wird, ist die WinForm-Anwendung keine Antwort und kann nicht geschlossen werden. Ich denke, der Code ist richtig. Meine Testumgebung ist 64-Bit Windows 7 3.5AnyCPU. Paul Zhou MSFT MSDN Community Support Feedback zu uns Get oder Anfrage Code Beispiel von Microsoft Bitte denken Sie daran, die Antworten als Antworten zu markieren, wenn sie helfen und sie aufheben, wenn sie keine Hilfe bieten. Donnerstag, 10. November 2011 08:23 Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für die Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen
No comments:
Post a Comment