Thursday 26 October 2017

Waitforexit Process C # Beispielprogramme


Ich habe eine Konsolenanwendung, die andere Konsolenanwendungen aufruft. Ich kann nicht instanziieren Prozess und verwenden, dass, wie ich die Fehlermeldung Die angegebene ausführbare Datei ist keine gültige Anwendung für diese OS-Plattform. Ich kann die apps mit der statischen Version von Process z. Allerdings kann ich nicht den Prozess zu WaitForExit - eine App wird aufgerufen und nach einer Weile, bevor die erste App abgeschlossen ist, wird die zweite - die ist ein Problem, da es von der ersten App abzuschließen aufgerufen wird. Irgendwelche Vorschläge, wie man statische Version des Prozesses zu warten, um Exit (alt. Wie zu Instantiierung Prozess und in der Lage sein, clickonce angewendet apps aufgerufen werden) gefragt Apr 10 16 at 7:10 foobar - versucht dies. Es macht keinen Unterschied - die Verarbeitung geht einfach zum nächsten Anruf. Wenn ich Schritt durch den Code und versuchen, zu sehen, welchen Wert der Prozess var hat, bekomme ich quotBasePriority 39process. BasePriority39 warf eine Ausnahme von Typ 39System. InvalidOperationException39quot. Obwohl der Code in einem trycatch-Block ist, wird eine Ausnahme nicht ausgelöst. Ndash Dave Tapson Apr 10 16 am 10: 10Elina: Vielen Dank für Ihre Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die vor potenziellen Deadlocks warnen, wenn Sie das Ende der beiden umgeleiteten Stdout - und Stderr-Streams synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Auch scheint es, dass Sie den Prozess39 stdoutstderr Ausgang rechts zurück als Eingang senden. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, TPL-basierte Lösung (Task Parallel Library, TPL) basierte Lösung für 4.5 und höher. Antwort # 2 am: Juli 12, 2010, 07:10:13 am »Ich Sache, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:12:13 pm» True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot lt Obeycommand. txtquot, um Ihren Code zu zu vereinfachen Oder vielleicht etwas gleichbedeutend mit quotecho Befehl quotieren Pfad quotggsci. exequot, wenn Sie wirklich don39t eine separate obeycommand. txt-Datei verwenden möchten. Ndash Amit Naidu Ihre Lösung braucht nicht AutoResetEvent aber Sie Umfrage. Wenn Sie statt der Verwendung von Ereignis (wenn sie verfügbar sind) abstimmen, dann verwenden Sie CPU ohne Grund und dass Sie sind ein schlechter Programmierer. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Ich war mit dem gleichen Problem, aber der Grund war anders. Es würde jedoch unter Windows 8, aber nicht unter Windows 7 auftreten. Die folgende Zeile scheint das Problem verursacht haben. Die Lösung war, NICHT deaktivieren UseShellExecute. Ich erhielt nun ein Shell-Popup-Fenster, das unerwünscht ist, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich die folgenden Work-around für das: Jetzt ist das einzige, was mich stört, warum dies geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit Hilfe von asynchronen Stream zu lösen, indem Sie in Konto Mark Byers, Rob, stevejay Antworten lösen würde. Dabei erkannte ich, dass es einen Fehler im Zusammenhang mit asynchrone Prozess-Ausgabe-Stream zu lesen. Sie können das nicht tun: Sie erhalten System. InvalidOperationException. StandardOut wurde nicht weitergeleitet oder der Prozess hat noch nicht begonnen. Danach müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Führen Sie deshalb eine Racebedingung aus, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron setzen. Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setzen Sie es auf asynchron. Aber das gleiche Problem tritt auf. Es wird eine Racebedingung zwischen dem synchronen Lesen und dem Setzen des Streams in den asynchronen Modus geben. Es gibt keine Möglichkeit, das sichere asynchrone Lesen eines Ausgabestreams eines Prozesses in der eigentlichen Weise zu erledigen. Process und ProcessStartInfo wurden entworfen. Sie sind wahrscheinlich besser mit asynchronen Lesen wie von anderen Benutzern für Ihren Fall vorgeschlagen. Aber Sie sollten sich bewusst sein, dass Sie einige Informationen aufgrund Rennen Bedingung verpassen könnte. Ich schreibe eine Anwendung, wo es zwei Anrufe an externe Programme, RichCopy und 7zip. Die Idee ist, mit RichCopy Dateien und 7zip zu archivieren und zu verschlüsseln, sobald RichCopy beendet ist. Das Problem Im, das ist, dass die Anwendung nicht auf RichCopy wartet, um bewegliche Akten zu beenden, bevor 7zip versucht, sie zu archivieren trotz der Tatsache, dass Im mit WaitForExit. Code ist unten: So RichCopy startet, aber sofort, nachdem ich den Splash-Screen für RichCopy 7zip sehen startet die Archivierung und Verschlüsselung eines leeren Ordners. Gibt es etwas Im fehlt oder ist die WaitForExit () - Methode soll warten, bis der Prozess beendet, bevor Sie auf die nächste Zeile des Codes gefragt September 23, 2010, um 12:11 Uhr Versuchen Sie Folgendes: anstelle von void filecopy (), return Prozess. Der Prozess, den Sie zurückgeben, ist f1. In encryptdata, fügen Sie ein Process-Argument und legen Sie diese auf den Prozess zurück, den Sie von filecopy zurückgeben. Dann, in encryptdata, warten, bis der Prozess abgeschlossen ist, bevor Sie den Zip-Prozess starten. Was ich denke, geschieht ist, dass die WaitForExit in filecopy aus irgendeinem Grund nicht blockierend ist. Entweder ist es optimiert weg, weil theres nichts dahinter, oder es wartet, aber die nächste Zeile der aufrufenden Funktion wird trotzdem gestartet. Eine weitere Möglichkeit besteht darin, dass Ihre Dateikonkopie RichCopy mit fehlerhaften Argumenten startet, was dazu führt, dass es früh beendet wird (entweder weil es nichts unternimmt oder weil es einen Fehler zurückgibt). Versuchen Sie, filecopy separat auszuführen, um zu sehen, ob es richtig funktioniert und tut, was Sie erwarten. Antwort # 2 am: September 23, 2010, um 12:25 Uhr Dank Nate - I39ll geben Sie diese Vorschläge einen Versuch. Ich habe versucht, die Datei kopieren Teil des Programms zu isolieren und das funktioniert wie erwartet. Wenn ich das Programm ein zweites Mal, 7zip tatsächlich sieht die zuvor verschobenen Dateien aus dem ersten Lauf und archivesencrypts sie wie erwartet, aber ich kann nicht scheinen, um es zu warten, bis RichCopy zu beenden. Ndash Luke Smith Für alle, die diese Frage in Zukunft kommt, was ich am Ende tat, war eine Weile Schleife um einen Scheck, um zu sehen, wenn der Prozess RichCopy64 noch ausgeführt wurde. Wenn es noch läuft Ich sagte ihm, für 10 Sekunden warten und dann versuchen Sie es erneut. Vielen Dank an alle, die reagiert - wenn ich genug rep Ill bekommen sicher sein, upvote Ihre Antworten. Ich habe eine Situation, wo ich eine Datei ausführen möchten, und löschen Sie dann die ausführbare Datei, wenn die Ausführung durchgeführt wird. 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 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

No comments:

Post a Comment