Wednesday 25 October 2017

Waitforexit Timeout Funktioniert Nicht


Der Code sieht fast so aus: Wie du sehen kannst, startet der Code einen cmd. exe Prozess und übergibt ihm den Befehl, den ich ausgeführt werden soll. Ich leite standardError und StandarOutput um, um sie aus dem Code zu lesen. Der Code liest sie vor dem Prozess. WaitForExit (Timeout) Aufruf, wie von Microsoft empfohlen (mehr dazu später). Das Problem entsteht, wenn der Befehl, den ich an cmd. exe sendet, niemals endet oder hängt unendlich. In dem Code habe ich den Befehl ping - t 8.8.8.8 verwendet, der wegen der Option - t den Host ohne Stopp pingt. Was passiert Der cmd. exe Prozess zusammen mit dem ping - t Befehl nie beendet und nie schließt den Stdout-Stream und so unser Code hängt an der Ausgabe process. StandardOutput. ReadToEnd () Zeile, weil es nicht erfolgreich sein kann, 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 ist, umgeleitete Ströme vor dem Prozess zu lesen. WaitForExit (Timeout) Aufruf, das gilt besonders, wenn Sie die WaitForExit Signatur ohne Timeout verwenden. Wenn Sie Prozess anrufen. 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 unser Code kann nicht erreichen die Linien Ausgabe Prozess. StandardOutput. ReadToEnd () In der Tat ist das Kind-Prozess (der Ping-Befehl oder eine Batch-Datei oder was auch immer Prozess, den Sie ausführen) kann nicht weitergehen, wenn unser Programm nicht die gefüllten Puffer der Streams liest und das kann nicht passieren, weil der Code hängt Die Linie mit dem 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. Sparen Sie eine davon in C: testbuffsize. bat und führen Sie unseren Programmaufrufprozess aus. WaitForExit () vor Ausgabevorgang. StandardOutput. ReadToEnd () wie in Code 2. Sie können es tun, schreiben Sie CommandResult Ergebnis ExecuteShellCommandSync (c: testbuffsize. bat, 1000) an Zeile 13 von Code 1. Der Code wird nicht hängen, aber wenn Sie ein weiteres Byte in einem der beiden Streams schreiben, wird es die Puffergröße überlaufen, die das Programm macht 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 letztes Ding bemerken Sie bitte, dass, wenn das Kind-Prozess beendet, nur weil Sie den Prozess verwenden. WaitForExit (Timeout) Signatur und es geht eigentlich in Timeout Sie sollten die cmd. exe Prozess und seine möglichen Kinder zu töten. So habe ich kämpfte dieses Problem für eine Weile jetzt und versuchte viele verschiedene Möglichkeiten, um es zu beheben, aber nicht. Bascally waht meine app tut ruft eine Java-Datei, um eine Anwendung auf ein Gerät zu laden. Während seine Beladung es auf eine Richtext-Box druckt, dann möchte ich weiter zur nächsten Datei wechseln. Das Problem, das ich habe, ist, dass, während die erste Datei geladen wird, versucht die 2. zu laden, welche Fälle Probleme. Ich habe versucht, die Wartezeit für den Ausgang, aber wenn ich das tun, dann werden die Ausgabedaten nicht in das reiche Textfeld geschrieben. Irgendwelche Ideen, die ich versuchte, das Warten auf Ausfahrt an vielen verschiedenen Orten zu setzen, aber es scheint nicht zu funktionieren. Zwei Methoden unten schreiben die stdout oder Fehler auf die richtext Feld. Jede Idee wäre toll. Grundsätzlich brauche ich den Prozess zu beenden, also dann kann ich weiter gedacht, die forloop, um die nächste Datei zu laden. Bekommst du irgendeine Art von Fehlermeldung Es scheint mir wie deine Argumente sind - Xmx512M - jar. Fehlt ein Leerzeichen nach der Befehlszeilenoption - jar. Das könnte dazu führen, dass es einfach sofort beenden, weil er nicht in der Lage ist, den Befehl zu verstehen. Außerdem, wie M. Babcock vorgeschlagen, verschieben Sie die loaddPB-Methode aus dem UI-Thread, und stellen Sie sicher, um das Laden Teil in einem Semaphor zu wickeln, so wird nur eine einzelne Datei geladen zu einem Zeitpunkt geladen und die Benutzeroberfläche kann weiterhin tun, was sie benötigt tun. Ndash SPFiredrake Feb 9 12 at 15:29 Seien Sie gewarnt, dass dies etwas quothackishquot in, dass you39re noch blockiert die UI-Thread, aber Sie manuell pumpen die Ereignisse durch die Nachricht Warteschlange. Dies ist NICHT eine Best Practice, und die meisten Entwickler werden es dagegen empfehlen. Die beste Option ist, den Ladecode in einen separaten Thread zu werfen. Ndash SPFiredrake Feb 9 12 um 15:54 Uhr

No comments:

Post a Comment