Saturday 25 November 2017

Prozess Waitforexit Wartet 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. Ich habe eine Situation, wo ich eine Datei ausführen, und löschen Sie dann die ausführbare Datei, wenn die Ausführung erledigt. Ich verwende System. Diagnostics. Process. Start (), um die Datei auszuführen, und verwenden Sie. WaitForExit (), um zu warten, bis der Prozess abgeschlossen ist. Ich verwende dann File. Delete (Dateiname), um die ausführbare Datei zu löschen. Das Problem ist, dass manchmal File. Delete mit dem folgenden Fehler fehlschlägt: Das führt mich zu glauben, dass irgendwie der Prozess noch am Leben ist und die ausführbare Datei sperren, auch nachdem der. WaitForExit () - Aufruf zurückgegeben wird. Ich habe andere Threads im Netz gefunden, die das gleiche Verhalten beschreiben, aber ich habe keine gefunden, die mit einer vernünftigen Erklärung oder Lösung des Problems abschließen, außer Anregungen, einen Sleep (n) nach dem WaitForExit () zu setzen. Beispiele: Hier ist ein Beispielprogramm, das das Problem für mich reproduziert. Ich habe auf Windows XP und Windows 7 getestet, und sie beide schließlich scheitern an einem gewissen Punkt mit dem gleichen Fehler. Beachten Sie auch, dass die ss. exe-ausführbare Datei eine einfache einfache Hello Worldquot-Konsolenanwendung ist. Und die Ausgabe sieht typischerweise so etwas aus (mit unterschiedlicher Anzahl von Iterationen vor dem Absturz): Irgendwelche Ideen, warum dies geschieht, und wenn es einige Fix für diese (außer Putting Schlaf in den Code) Freitag, 8. Januar 2010 3 : 40 PM Der Grund ist, dass, obwohl der Prozess abgeschlossen ist, kann es ein paar Millisekunden für das Betriebssystem bis zum Ende der Zerstörung dauern. Es ist ein Multitasking-Betriebssystem, nachdem alle, seine versucht, alle zur gleichen Zeit Service. Unglücklicherweise gibt es keine Möglichkeit, zu wissen, wann die Datei nicht mehr gesperrt ist (vorsätzlich). Wenn Sie WaitForExit, erstellen Sie ein Sperrobjekt auf dem Prozessobjekt. Das Prozessobjekt kann nicht zerstört werden, bis die Sperre freigegeben wird und Sie können nicht auf etwas warten, das nicht vorhanden ist (Huhn und Eiart von Ausgabe). Also die einzige vernünftige Sache, die Sie tun können, ist immer wieder versuchen, so etwas wie: Marked als Antwort von Samuel Stanojevic Freitag, den 08. Januar 2010 um 16:20 Uhr Editiert von Tergiver Freitag, 8. Januar 2010 16.20 Uhr geändert, um bool, Endlosschleife Fix Freitag, 08. Januar 2010 16:15 Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für die Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen Helfen Sie uns, MSDN zu verbessern. Besuchen Sie unsere UserVoice-Seite, um auf Ideen Dev Centers Lernressourcen vorzulegen und abzustimmen

No comments:

Post a Comment