Waitforexit Prozess C # Startinfo


Ich habe den folgenden Code: Ich weiß, dass die Ausgabe aus dem Prozess, den ich anfangen, rund 7 MB lang ist. Es läuft in der Windows-Konsole funktioniert gut. Unglücklicherweise hängt das programmgesteuert auf WaitForExit unbegrenzt. Beachten Sie auch, dass dies nicht für kleinere Ausgänge (wie 3KB) hängt. Ist es möglich, dass die interne StandardOutput in ProcessStartInfo cant Puffer 7MB Wenn ja, was soll ich stattdessen tun Wenn nicht, was mache ich falsch Das Problem ist, dass, wenn Sie umgeleitet werden StandardOutput und StandardError der interne Puffer kann voll werden. Unabhängig von der Reihenfolge, die Sie verwenden, kann es ein Problem geben: Wenn Sie warten, bis der Prozess beendet wird, bevor Sie StandardOutput lesen, kann der Prozess blockieren und versucht, es zu schreiben. Wenn Sie von StandardOutput mit ReadToEnd lesen, dann kann Ihr Prozess blockieren, wenn der Prozess standardOutput nie schließt (zum Beispiel wenn es nie beendet wird, oder wenn es blockiert ist, schreiben in StandardError). Die Lösung besteht darin, asynchrone Lesevorgänge zu verwenden, um sicherzustellen, dass der Puffer nicht voll wird. Um irgendwelche Deadlocks zu vermeiden und alle Ausgabe von StandardOutput und StandardError zu sammeln, kannst du dies tun: EDIT: Siehe untenstehende Antworten, um das Timeout zu behandeln und ObjectDisposeException Ausnahmen zu vermeiden. Die Dokumentation für Process. StandardOutput sagt zu lesen, bevor Sie warten, sonst können Sie Deadlock, Snippet kopiert unten: Mark Byers Antwort ist ausgezeichnet, aber ich würde nur hinzufügen, die folgenden: die OutputDataReceived und ErrorDataReceived Delegierten müssen entfernt werden, bevor die outputWaitHandle und errorWaitHandle erhalten Entsorgt Wenn der Prozess weiterhin Daten ausgibt, nachdem die Zeitüberschreitung überschritten wurde und dann beendet wird, wird auf die Variablen outputWaitHandle und errorWaitHandle zugegriffen, nachdem sie entsorgt wurden. (FYI Ich musste diese Einschränkung als Antwort hinzufügen, wie ich konnte nicht auf seinen Beitrag kommentieren.) Wir haben dieses Problem auch (oder eine Variante). Versuchen Sie Folgendes: 1) Fügen Sie ein Timeout zu p. WaitForExit (nnnn) hinzu, wobei nnnn in Millisekunden ist. 2) Setzen Sie den ReadToEnd-Anruf vor dem WaitForExit-Aufruf. Dies ist, was wir gesehen haben MS empfehlen. Ich habe eine Situation, wo ich eine Datei ausführen wollen, und löschen Sie dann die ausführbare Datei, wenn die Ausführung abgeschlossen ist. Ich benutze System. Diagnostics. Process. Start (), um die Datei auszuführen, und verwenden Sie. WaitForExit (), um zu warten, bis der Prozess abgeschlossen ist. Ich verwende dann File. Delete (Dateiname), um die ausführbare Datei zu löschen. Das Problem ist, dass manchmal File. Delete mit dem folgenden Fehler fehlschlagen wird: Das führt mich zu glauben, dass irgendwie der Prozess noch am Leben ist und die ausführbare Datei auch dann beendet, wenn der. WaitForExit () - Aufruf zurückgegeben wird. Ich habe andere Threads auf dem Netz gefunden, die das gleiche Verhalten beschreiben, aber ich habe keine gefunden, die mit einer vernünftigen Erklärung oder Lösung für das Problem zu schließen, außer Anregungen der Platzierung eines Sleep (n) nach dem WaitForExit (). Beispiele: Hier ist ein Beispielprogramm, das das Problem für mich reproduziert. Ich habe auf Windows XP und Windows 7 getestet, und sie beide scheitern schließlich irgendwann mit dem gleichen Fehler. Beachten Sie auch, dass die ss. exe-ausführbare Datei eine einfache einfache Hello Worldquot-Konsolenanwendung ist. Und die Ausgabe sieht typischerweise so etwas aus (mit unterschiedlicher Anzahl von Iterationen vor dem Absturz): Irgendwelche Ideen, warum dies geschieht, und wenn es einige Fix für diese (außer Putting Schlaf in den Code) Freitag, 8. Januar 2010 3 : 40 PM Der Grund ist, dass, obwohl der Prozess abgeschlossen ist, kann es ein paar Millisekunden für das Betriebssystem bis zum Ende der Zerstörung dauern. Es ist ein Multitasking-Betriebssystem, nachdem alle, seine versucht, alle zur gleichen Zeit Service. Unglücklicherweise gibt es keine Möglichkeit, zu wissen, wann die Datei nicht mehr gesperrt ist (vorsätzlich). Wenn Sie WaitForExit haben, erstellen Sie ein Sperrobjekt auf dem Prozessobjekt. Das Prozessobjekt kann nicht zerstört werden, bis die Sperre freigegeben wird und Sie können nicht auf etwas warten, das nicht vorhanden ist (Huhn und Eiart von Ausgabe). Also die einzige vernünftige Sache, die Sie tun können, ist immer wieder versuchen, so etwas wie: Als Antwort von Samuel Stanojevic markiert Freitag, 8. Januar 2010 16:20 Bearbeitet von Tergiver Freitag, 8. Januar 2010 16:20 Uhr geändert auf bool, Endlosschleife Fix Freitag, 8. Januar 2010 16.15 Uhr 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

Comments

Popular posts from this blog

Beratungsdefinition Investopedia Forex

Forex Forum Posting Site Liste

Copytrade Forex Karten