Sunday, 21 May 2017

Processstartinfo C # Waitforexit Funktioniert Nicht


NET 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 funktionierte, 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 in wie ich das Problem gelöst. Thread. WaitForExit () funktioniert nicht Ich habe ein Programm, das Notizblock wie folgt ausführen: ProcessStartInfo myP neu ProcessStartInfo () using (Prozess myp new Process ()) myp. StartInfo myP Versuch myp. Start () myp. WaitForExit () Console. WriteLine (alles guttes) Fang Console. WriteLine (fehlgeschlagen) Das geht gut, alles guttes Ausgeführt, nachdem ich Editor schließen. Aber wenn ich die notepad. exe mit Drittanbietersoftware ändere, die Dateien und so weiter verarbeitet, werden alles guttes direkt angezeigt und es scheint, dass myp. WaitForExit nicht funktioniert. Bin ich vermissen etwas RE: Thread. WaitForExit () funktioniert nicht obislavu (Programmierer) 21 Jan 05 09:27 Die WaitForExit () - Methode weist die Prozesskomponente an die angegebene Anzahl von Millisekunden oder unbegrenzt warten, bis der zugehörige Prozess zu beenden. Ich bin nicht sicher, was Sie implementieren möchten, aber ich denke, Sie sollten Exited-Ereignis verwenden, um die Prozess-Kündigung: System. Diagnostics. Process myp neue System. Diagnostics. Process () zu erfassen. Myp. EnableRaisingEvents true myp. StartInfo. UseShellExecute Falsche Überprüfung, ob dies erforderlich ist myp. Exited new EventHandler (captureExit) myp. WaitForExit () myp. Start () private void captureExit (Objektsender, EventArgs e) System. Diagnostics. Process ps ( System. Diagnostics. Process) Absender Kombinieren Sie diese mit Mutex - oder Monitor-Objekten, um den aktuellen Thread zu steuern. (Siehe WaitOne (), WaitAny (), Warten () Methoden). - obislavu - Red Flag Vorgeschlagen Vielen Dank für die Hilfe halten Tek-Tips Foren frei von unangemessenen Beiträge. Die Mitarbeiter von Tek-Tips werden dies prüfen und entsprechende Maßnahmen ergreifen. Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Klicken Sie hier, um zu Tek-Tips zu kommen und mit anderen Mitgliedern zu sprechen

No comments:

Post a Comment