Useshellexecute Waitforexit C #
Elina: Danke für deine Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. 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 einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:49: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 der Race condition. ProcessStartInfo. RedirectStandardOutput-Eigenschaft verpassen können Wenn ein Prozess Text in seinen Standard-Stream schreibt, wird dieser Text normalerweise auf der Konsole angezeigt. Wenn Sie RedirectStandardOutput auf true setzen, um den StandardOutput-Stream umzuleiten, können Sie die Ausgabe eines Prozesses manipulieren oder unterdrücken. Zum Beispiel können Sie den Text filtern, formatieren Sie ihn anders oder schreiben Sie die Ausgabe an die Konsole und eine ausgewählte Protokolldatei. Sie müssen UseShellExecute auf false setzen, wenn Sie RedirectStandardOutput auf true setzen möchten. Andernfalls wirft das Lesen aus dem StandardOutput-Stream eine Ausnahme aus. Der umgeleitete StandardOutput Stream kann synchron oder asynchron gelesen werden. Methoden wie Lesen. Zeile lesen. Und ReadToEnd führen synchrone Leseoperationen auf dem Ausgabestream des Prozesses durch. Diese synchronen Leseoperationen werden nicht abgeschlossen, bis der zugehörige Prozess in den StandardOutput-Stream schreibt oder den Stream schließt. Im Gegensatz dazu startet BeginOutputReadLine asynchrone Leseoperationen im StandardOutput-Stream. Diese Methode ermöglicht einen designierten Event-Handler (siehe OutputDataReceived) für die Stream-Ausgabe und kehrt sofort zum Caller zurück, der andere Arbeiten ausführen kann, während die Stream-Ausgabe an den Event-Handler gerichtet ist. Die Anwendung, die die asynchrone Ausgabe verarbeitet, sollte die WaitForExit-Methode aufrufen, um sicherzustellen, dass der Ausgabepuffer gelöscht wurde. Synchrone Leseoperationen führen eine Abhängigkeit zwischen dem Anrufer-Lesen aus dem StandardOutput-Stream und dem untergeordneten Prozess ein, der in diesen Stream schreibt. Diese Abhängigkeiten können zu Deadlock-Bedingungen führen. Wenn der Anrufer aus dem umgeleiteten Strom eines Kindprozesses liest, ist er vom Kind abhängig. Der Anrufer wartet auf den Lesevorgang, bis das Kind in den Stream schreibt oder den Stream schließt. Wenn der untergeordnete Prozess genug Daten schreibt, um seinen umgeleiteten Stream zu füllen, ist er vom Elternteil abhängig. Der untergeordnete Prozess wartet auf den nächsten Schreibvorgang, bis der Elternteil aus dem Vollstrom liest oder den Stream schließt. Die Deadlock-Bedingung ergibt sich, wenn der Anrufer und das Kind-Prozess auf einander warten, um eine Operation abzuschließen, und es kann auch nicht weitergehen. Sie können Deadlocks vermeiden, indem Sie Abhängigkeiten zwischen dem Anrufer und dem Child-Prozess auswerten. Beispielsweise zeigt der folgende C-Code, wie man aus einem umgeleiteten Stream liest und darauf wartet, dass der untergeordnete Prozess beendet wird. Das Codebeispiel vermeidet eine Deadlock-Bedingung durch Aufruf von p. StandardOutput. ReadToEnd vor p. WaitForExit. Eine Deadlock-Bedingung kann resultieren, wenn der übergeordnete Prozess p. WaitForExit vor p. StandardOutput. ReadToEnd aufruft und der untergeordnete Prozess genug Text schreibt, um den umgeleiteten Stream zu füllen. Der übergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Kindprozess beendet wird. Der untergeordnete Prozess würde auf unbestimmte Zeit warten, damit das Elternteil aus dem vollständigen StandardOutput-Stream lesen kann. Es gibt ein ähnliches Problem, wenn Sie alle Texte aus der Standardausgabe und Standardfehlerströme lesen. Beispielsweise führt der folgende C-Code eine Leseoperation auf beiden Strömen durch. Das Codebeispiel vermeidet die Deadlock-Bedingung durch die Durchführung von asynchronen Leseoperationen im StandardOutput-Stream. Eine Deadlock-Bedingung ergibt sich, wenn der übergeordnete Prozess p. StandardOutput. ReadToEnd gefolgt von p. StandardError. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um seinen Fehlerstrom zu füllen. Der übergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Kindprozess seinen StandardOutput-Stream schließt. Der untergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Elternteil aus dem vollständigen StandardError-Stream gelesen wird. Sie können asynchrone Leseoperationen verwenden, um diese Abhängigkeiten und ihr Deadlock-Potential zu vermeiden. Alternativ können Sie die Deadlock-Bedingung vermeiden, indem Sie zwei Threads erstellen und die Ausgabe jedes Streams auf einem separaten Thread lesen.
Comments
Post a Comment