Für einfache Fälle ist der Vorteil vor allem Bequemlichkeit. Offensichtlich haben Sie mit der ProcessStartInfo-Route noch mehr Optionen (Arbeitspfad, Auswahl zwischen Shell-Exec, etc.), aber es gibt auch eine statische Methode Process. Start (ProcessStartInfo). Re Überprüfung auf Fehler Process. Start gibt das Process-Objekt zurück, so dass Sie auf den Exit warten und den Fehlercode überprüfen können, wenn Sie benötigen. Wenn du stderr erfassen willst, wünschst du wohl entweder die ProcessStartInfo-Ansätze. Beantwortet Feb 12 11 um 10:33 Marc Gravell 9830 650k 9679 154 9679 1803 9679 2273 Könnten Sie mir ein Beispiel geben Wenn man Objekt bekommen muss und auf den Ausgang warten muss, scheint es mir, dass es keinen Grund für die Verwendung von Process. start () Wegen der Einfachheit. Ndash prosseek Feb 12 11 at 10:38 prosseek ok stellen Sie sich vor, Sie wollen Stdout und Stderr zu erfassen, führen Sie es in einem anderen user39s Konto, und erhalten Sie ein Ereignis, wenn es abgeschlossen ist. Aber ja für einfache Fälle ist die statische Methode einfacher. Ndash Marc Gravell 9830 Feb 12 11 bei 10: 42 Ich benutze Process. Start, um eine Batchdatei 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 verbessern konnte.
No comments:
Post a Comment