Friday 17 November 2017

C # Process Waitforexit Funktioniert Nicht


So habe ich dieses Problem für eine Weile jetzt gekämpft und versuchte viele verschiedene Weisen, es zu regeln aber kann 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 das Drucken auf eine richtext-Box, 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 reiche Textfeld geschrieben. Irgendwelche Ideen versuchte ich, die Wartezeit für Ausgang an vielen verschiedenen Plätzen, aber es scheint nicht zu funktionieren. Zwei Methoden unten schreiben die stdout oder Fehler auf die richtext Feld. Jede Idee 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. 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 Seien Sie gewarnt, dass dies etwas quothackishquot, dass you39re immer noch die UI-Thread blockieren, aber you39re manuell pumpen die Ereignisse durch die Message-Queue. 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 Feb 9 12 am 15: 54NET System. Diagnostics. Process Klasse 8211 Teil 1 Process. WaitForExit und. Exited-Ereignis aren8217t arbeiten Ich dachte, ich hätte dies gefunden werden, aber es war meine Schuld, wahrscheinlich das gleiche für Sie zu. Ich werde gehen, was ich gefunden, während der Erforschung und Lösung dieses Problems. Kurze Antwort: Verwenden Sie die asynchronen Process. BeginErrorReadLine () - und. BeginOutputReadLine () - Methoden, bevor Sie mit dem Aufruf von. WaitForExit () aufrufen und die Ausgabe aufzeichnen, indem Sie die Process. ErrorDataReceived - und. OutputDataReceived-Ereignisse einhängen, wenn Sie StandardOutput und and StandardError umleiten. 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 Batch-initiierten Batch-Prozess. Ich brauchte ein Tool, das spuckte eine Textdifferenzdatei beim Vergleich von zwei Dateien (nicht eine Zusammenführung Ergebnis-Datei). 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 Regressions-Framework ruft diffmerge. exe auf und speichert die resultierende diff-Datei für eine spätere Überprüfung. Ich codierte meine ProcessStartInfo Nachfolgend, dass mit dem Anstoß 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 habe ich festgestellt, dass manchmal mit meinem diffmerge Child Prozess mit verschiedenen Argumenten gearbeitet, manchmal war es nicht, was das Thema geheimnisvoll. Zweitens fand ich, dass es gut funktioniert, wenn ich didn8217t Umleitung Ausgabe. Also, offensichtlich fehlte mir etwas. Ich brauchte, um tatsächlich zu lesen, die Prozess-API-Dokumente, 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 auffüllt. Allerdings, was ich sah, war der StdOut-Puffer füllen, die Child-Prozess wurde auf dem nächsten StdOutStdError schreiben blockiert, war der Elternprozess unendlich warten auf den Child-Prozess zu warten, bevor Sie lesen aus dem StdOutStdError-Puffer. Für mich schien es, dass WaitForExit-Methode andor Exited-Ereignis gebrochen sind nicht fangen das Kind Prozess 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, Ich laufe 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