Tuesday 28 November 2017

Mono Prozess Waitforexit Hängt


So habe ich ein Programm Im in der Nähe mit abgeschlossen sein. Grundsätzlich, was ich auf mit ihr zu tun ist mit Windows Task Scheduler, um es zu bestimmten Zeiten in den sehr späten Morgen auf Auto-Konvertierung mit dem HandBrake-CLI-Tool, einige Dateien, die meine Mitarbeiter Dumps in den Quellordner aufrufen. Ich versuche, mein Programm nur zu konvertieren, ein Programm auf einmal in der foreach-Schleife, aber wenn ich process. WaitForExit () verwenden, hängt das Programm unbegrenzt, nachdem die erste Datei befindet und konvertiert wird. Immer wenn ich mein Programm debuggen Im bekommen 2 cmd Pop-ups aus welchem ​​Grund auch immer. Eines ist die eigentliche cmd Eingabeaufforderung, die den Befehl ausführt, der im Zeichenfolgebefehl gefunden wird, und der andere ist ein Pfad zu meinem Debugbinordner in Eigene Dokumente. Nachdem die erste Datei konvertiert wird, das eigentliche Befehlsfenster, das den Befehl ausführt und die Umwandlung DOES schließen, aber dann habe ich ein Popup-Fenster hinter ihm offen bleiben, die sagen, wenn ich process. WaitForExit () entfernen dann wird mein Programm beginnen, jede einzelne Datei zu konvertieren Im Quellordner, der in Ordnung ist, aber sein weniger als ideal. Hier ist mein Code. Ich möchte, dass das Programm nur eine Datei auf einmal umwandelt und die aktuelle Instanz des Prozesses automatisch beendet, bevor sie zum nächsten Spiel übergeht. Vielen Dank für jede Eingabe und Vorschläge. Der Code sieht fast so aus: Wie Sie sehen können, startet der Code einen cmd. exe-Prozess und übergibt an ihn den Befehl, den ich ausführen möchte. Ich umleiten StandardError und StandarOutput, um sie aus dem Code zu lesen. Der Code liest sie vor dem Prozess. WaitForExit (Timeout), wie von Microsoft empfohlen (mehr dazu später). Das Problem tritt auf, wenn der Befehl, den ich an cmd. exe sendet, niemals endet oder hängt unbegrenzt. Im Code verwendete ich den Befehl ping - t 8.8.8.8, der wegen der Option - t den Host ohne Stopp pingt. Was passiert Der Befehl cmd. exe zusammen mit dem Befehl ping - txt wird nie beendet und der Stdout-Stream wird nie geschlossen, und daher hängt unser Code an der Ausgabe process. StandardOutput. ReadToEnd () Zeile, weil es nicht gelingt, den gesamten Stream zu lesen. Das gleiche passiert auch, wenn ein Befehl in einer Batch-Datei aus irgendeinem Grund hängt und so der obige Code könnte kontinuierlich arbeiten für Jahre und dann hängen plötzlich ohne ersichtlichen Grund. Bevor ich schrieb, dass es empfohlen, um umgeleitete Streams vor dem Prozess lesen. WaitForExit (Timeout) Aufruf, auch das ist besonders wahr, wenn Sie die WaitForExit Signatur ohne das Timeout verwenden. Wenn Sie Prozess aufrufen. WaitForExit (), bevor Sie die umgeleiteten Datenströme lesen: code 2: Sie können einen Deadlock erleben, wenn der Befehl, den Sie an cmd. exe anhängen, oder der Prozess, den Sie aufrufen, die Standardausgabe oder Standardfehler erfüllt. Dies, weil unsere Code cant erreichen die Linien Output-Prozess. Standardausgang. ReadToEnd () In der Tat der Kind-Prozess (die Ping-Befehl oder eine Batch-Datei oder was auch immer Sie ausführen) cant gehen auf, wenn unser Programm nicht lesen Sie die gefüllten Puffer der Streams und dies kann passieren, weil der Code hängt Die Linie mit Prozess. WaitForExit (), die immer warten wird, bis das untergeordnete Projekt beendet wird. Die Standardgröße für beide Streams beträgt 4096 Byte. Sie können diese beiden Größen mit diesen Batchdateien testen: Das erste Skript schreibt 4096 Byte zur Standardausgabe und das zweite zu Standardfehler. Speichern Sie eine davon in C: testbuffsize. bat und führen Sie unseren Programmaufruf aus. WaitForExit () vor Ausgabeprozess. Standardausgang. ReadToEnd () wie in Code 2. Können Sie es schreiben Schreiben Sie CommandResult Ergebnis ExecuteShellCommandSync (c: testbuffsize. bat, 1000) in Zeile 13 von Code 1. Der Code wird nicht hängen, aber wenn Sie schreiben ein weiteres Byte in einem der beiden Streams wird es überlaufen die Puffergröße, die das Programm aufhängen. Wenn Sie die Standardausgabe oder Standardfehler umleiten und lesen müssen, ist die beste Lösung, sie asynchron zu lesen. Eine hervorragende Möglichkeit, dies zu tun, wird von Mark Byers in diesem Stackoverflow-Thread vorgeschlagen Als das letzte, beachten Sie bitte, dass, wenn der untergeordnete Prozess beendet, nur weil Sie den Prozess verwenden. WaitForExit (Timeout) Signatur und es tatsächlich geht in Timeout sollten Sie die cmd. exe Prozess und seine möglichen Kinder zu töten.

1 comment:

  1. 08uyIch bin reich geworden mit diesem programmierten gehackten programmierten Geldautomaten
    Nach dem College-Abschluss gab es keine Arbeit, also beschloss ich, ein kleines Unternehmen zu gründen, aber das Geld reichte nicht. Ich habe die Firma verlassen, es wurde sehr schwer für mich, weil ich das einzige Kind meiner Eltern und meiner Eltern war. Beide sind alt, sie glauben an meine tägliche Ernährung. Als ich eines Tages beim Surfen im Internet die Nachricht erhielt, dass dieser neu getauschte Geldautomat eine Karte zerbrechen und einen großen Geldbetrag abheben könnte, kontaktierte ich Sie per E-Mail. Zu meiner Überraschung erhielt ich die Karte wenige Tage nach Zahlung der geringen Gebühr für die Karte. Diese leere Debitkarte ist ein erstaunliches und schönes Produkt. Ich werde nie glauben, dass ich alles, was ich heute habe, mit dieser großen Freude im Herzen erwerben kann, also werde ich gute Nachrichten überbringen ... Das Leben ist positiv und geduldig, ich glaube daran, dass Großes möglich ist und in Sekunden geschieht. .. BRAIN HACKERS TECH WORLD hat mein Leben verändert ... Gott sei Dank können Sie uns VIA (brainhackers@aol.com) senden

    ReplyDelete