Thursday, February 23, 2017

Redirectstandardoutput Waitforexit C #

Ich habe eine App, die einen anderen Prozess in einem Befehlsfenster aufruft und dieser Prozess hat die Aktualisierung von Statistiken, die auf das Konsolenfenster ausgegeben werden. Ich dachte, dies war eine ziemlich einfache Operation, aber ich kann nicht scheinen, um es an die Arbeit. Bin ich etwas fehlt Im Idealfall, was ich möchte, ist, wie die Ausgabe ändert sich innerhalb dieses Prozesses schlage ich oder Daten kommt in den Leser, dass ich Ereignisse ausgeschaltet es. Jede mögliche Hilfe würde groß sein, ich fühle mich wie dieses ist eine Neulingfrage aber scheinen, etwas zu vermissen. Gefragt Jul 17 09 at 22:33 Ive erlebt dies vor. Manchmal ist die Art und Weise, in der der Prozess, den Sie die Ausgänge auf die Konsole aufrufen, nicht mit dieser Art von Ausgabeumleitung kompatibel. Ive gewesen glücklich genug in diesem Fall in der Lage sein, den externen Prozess zu ändern, um dies zu ändern. Sie könnten versuchen, Ihren Code auf einem anderen Prozess auszuführen, der an die Konsole ausgibt, und sehen, ob es ordnungsgemäß funktioniert. Es liest ungefähr Recht zu mir gerade jetzt. Ich ging und zog ein Code-Block Ive verwendet, um dies zu tun. Dies ist in einer WPF-App, die die Prozessausgabe an das Fenster umleitet. Beachten Sie die Ereignisbindung. Da dies WPF ist, muss ich meinen Aufruf aufrufen, um die Daten zu schreiben. Da Sie Arent besorgt über Blockierung, sollten Sie in der Lage, einfach zu ersetzen, dass mit: Hoffentlich hilft es Interessant können Sie nicht aus Standard-Ausgabe und Standard-Fehler zur gleichen Zeit lesen: wenn Sie sowohl Standard-Ausgabe und Standard-Fehler umleiten und dann versuchen, beide zu lesen , Beispielsweise unter Verwendung des folgenden C-Codes. String-Ausgabe p. StandardOutput. ReadToEnd () String-Fehler p. StandardError. ReadToEnd () In diesem Fall, wenn der untergeordnete Prozess einen beliebigen Text auf Standardfehler schreibt, wird es den Prozess blockieren, da der übergeordnete Prozess nicht vom Standardfehler lesen kann, bis es hat Fertig ausgelesen. Der übergeordnete Prozess wird jedoch nicht von der Standardausgabe gelesen, bis der Prozess beendet ist. Eine empfohlene Lösung für diese Situation ist es, zwei Threads zu erstellen, damit Ihre Anwendung die Ausgabe von jedem Stream auf einem separaten thread. Elina lesen: Danke 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 die process39 stdoutstderr Ausgabe rechts zurück als Eingang senden. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, aufwändige, Task Parallel Library (TPL) basierte Lösung für. NET 4.5 und höher. Antwort # 2 am: Juli 23, 2010, 07:50:13 am »Ich Sache, dass dies einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 23, 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 die Umfrage statt der Verwendung von Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und dass zeigen, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (Aber ich habe dir nicht gegeben -1, weil du versucht hast zu helfen). Ndash Eric Ouellet 7. November um 18:38 Ich hatte das gleiche 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 folgende Arbeit-um für das hinzu: Jetzt das einzige, das mich stört, ist, warum dieses geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit 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. Dann müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Machen Sie also eine Racebedingung, 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 tatsächlichen Weise zu erledigen. Process und ProcessStartInfo wurde 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 Rasse Zustand verpassen könnte.


No comments:

Post a Comment