Saturday 25 March 2017

Beginoutputread Waitforexit Doesnt Wait

Also habe ich kämpfen dieses Thema für eine Weile jetzt und versuchte viele verschiedene Möglichkeiten, um es zu beheben, kann aber nicht. Grundsätzlich waht meine app tut ruft eine Java-Datei, um eine Anwendung auf einem Gerät zu laden. Während seine Beladung es druckt es auf ein richtext-Feld, dann möchte ich auf die nächste Datei verschieben. 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 Rich-Textfeld geschrieben. Irgendwelche Ideen versuchte ich, das Warten für Ausgang an vielen verschiedenen Plätzen zu setzen, aber es scheint nicht zu funktionieren. Zwei Methoden unten schreiben Sie die stdout oder Fehler auf die richtext Feld. Alle Ideen wäre toll. Bascally Ich brauche den Prozess zu beenden, so dass dann kann ich weiterhin gedacht, die forloop die nächste Datei laden. Werden Sie jede Art von Fehlermeldung Es scheint mir, wie Ihre Argumente sind - Xmx512M - jar. Fehlt ein Leerzeichen nach der Befehlszeilenoption - jar. Das könnte dazu führen, dass es nur sofort verlassen, weil nicht in der Lage, den Befehl zu verstehen. Auch, wie M. Babcock vorgeschlagen, die loaddPB Methode aus dem UI-Thread zu bewegen, und stellen Sie sicher, dass das Ladeteil in einer Semaphore zu wickeln, auf diese Weise nur eine einzelne Datei zu einem Zeitpunkt geladen wird, und die Benutzeroberfläche kann weiterhin tun, was es braucht tun. ndash SPFiredrake 9. Februar 12 um 15:29 Uhr Seien Sie gewarnt, dass dies etwas quothackishquot in diesem you39re noch den UI-Thread zu blockieren, aber you39re die Ereignisse durch die Nachrichtenwarteschlange manuell zu pumpen. Dies ist nicht eine bewährte Praxis, und die meisten Entwickler werden dagegen empfehlen. Die beste Option ist, den Ladecode in einen separaten Thread zu werfen. ndash SPFiredrake 9. Februar 12 um 15: 54NET System. Diagnostics. Process Klasse 8211 Teil 1 Process. WaitForExit und. Exited Ereignis aren8217t arbeitete ich dachte, dass ich dies der Fall sein, gefunden hatte, aber es war meine Schuld, wahrscheinlich das gleiche auch für Sie. Ich werde gehen, was ich gefunden, während der Erforschung und Lösung dieses Problems. Kurze Antwort: Wenn Sie Umleiten StandardOutput andor Standarderror, optimale Nutzung der asynchrone Process. BeginErrorReadLine () und. BeginOutputReadLine () Methoden VOR. WaitForExit () aufrufen und erfassen die die Ausgabe durch die Process. ErrorDataReceived Einhaken und. OutputDataReceived Ereignisse. Die lange Antwort beginnt mit mir mit dem Visual Studio diffmerge. exe im Ordner Common7IDE, um Textdateien im Batch-Modus zu vergleichen. Ich bin der Einführung eines Regressionstests in einem Build initiiert Batch-Prozess. Ich brauchte ein Werkzeug, spuckte eine Textdifferenzdatei beim Vergleich von zwei Dateien (nicht eine zusammenfassen Ergebnisdatei). WinMerge und Beyond Compare sind zu meiner Verfügung, aber sie scheinen nichts zu produzieren, aber zusammengeführte Ergebnisse (was normalerweise ist, was ich will, aber nicht dieses Mal). Mein Regression Framework ruft diffmerge. exe und speichern Sie die resultierende Diff-Datei für eine spätere Überprüfung. Ich codierte meine ProcessStartInfo Verfolgt, dass mit dem Treten des Prozesses und warten, bis der Prozess zu beenden. Und warten warten warten. Dies hat mich lesen MSDN und graben tiefer in den Einsatz der Process-Klasse. Ich fand heraus, einige interessante Informationen, wahrscheinlich hätte offensichtlich sein sollen. Zuerst fand ich, dass manchmal laufen meine diffmerge Child Process mit verschiedenen Argumenten gearbeitet, manchmal war es nicht, was das Thema geheimnisvoll. Zweitens fand ich, dass es gut funktioniert, wenn ich didn8217t Umleitung Ausgabe. So, offensichtlich fehlte mir etwas. Ich brauchte, um tatsächlich die Prozess-API-Docs zu lesen, und so fand ich dieses Nugget: MSDN-Artikel Nach dem Finden und Lesen, dass MSDN-Artikel verstand ich. Mein Codebeispiel oben funktioniert, wenn der StdOut - oder StdError-Puffer nicht aufgefüllt wird. Aber was ich sah die StdOut Puffer füllt, wurde das Kind-Prozess auf der nächsten StdOutStdError Schreib blockiert, wurde der übergeordnete Prozess wartet unendlich auf der Kind-Prozess zu beenden, bevor sie aus dem StdOutStdError Puffer zu lesen. Mir schien es, dass WaitForExit Methode Ereignis andor Exited sind gebrochen, das Kind nicht Prozess zu kontrollieren Verlassen aber es war mein Code, der gebrochen war. Ich änderte den Code, um die asynchrone Methoden zu verwenden und plötzlich ging meine Probleme weg. Keine Blockierung mehr, alles funktionierte wie erwartet. Ich verwendete StringBuilders als Puffer, um die Daten zu halten, die in den Ereignissen empfangen werden. In Teil 2, laufe ich in ein Problem mit der Process StdOutStdError ReadLine-Implementierungen um meine spezifischen Bedürfnisse, gehe ich, wie ich das Problem gelöst.


No comments:

Post a Comment