Thursday 2 March 2017

Beginoutputreadline Waitforexit


Elina: Danke für deine 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 Rasse Bedingung verpassen könnte. Hi, Ich entwickle eine C-Konsole-Anwendung, die eine Kommandozeile startet und bekommt einige Daten durch einen anderen Befehl (was in dieser Diskussion irrelevant ist). Irgendwann werde ich einige Daten in der Befehlszeile und ich brauche nur die letzte Zeile, die. Ich habe den folgenden Code verwendet: Process. StartInfo. FileName quotcmd. exequot Process. StartInfo. RedirectStandardInput true Process. StartInfo. RedirectStandardOutput true Ich habe Process. StandardInput. WriteLine verwendet, um die Befehle zu schreiben, die ich an der Konsole benötige. Aber wenn Process. StartInfo. RedirectStandardOutput true ist, erhalte ich nicht die erforderliche Ausgabe mit der Anweisung Process. StandardOutput. ReadToEnd () Split (n) Wohingegen ReadLine Option gut funktioniert und ich bekomme die erste Zeile des Textes angezeigt. Da jedesmal die Daten, die ich auf der Konsole bekomme, unterschiedlich sind, kann ich nicht hartcodieren jede spezifische Loaction von wo ich meine Ausgabe bekommen. Auch wenn ich eine Watch auf die Anweisung Process. StandardOutput. ReadToEnd (). Split (n) Ich erhalte eine Funktion Timeout-Ausnahme. Bitte helfen Sie mir mit diesem Problem. Donnerstag, August 07, 2008 5:44 AM Also habe ich Manjus-Code kopiert. Myprocesss quotcmd. exequot. Zuerst schickte ich den Befehl quotipconfigquot mit einem readToEnd () Timed out. Versuchtes Lesen in Blöcken, scheiterte auch. Bewährte waitForInputIddle (), aber vergessen, cmd hat keine grafische Benutzeroberfläche, fehlgeschlagen. Also brauchte ich das cmd, um den Stream zu beenden, wenn ich es jemals lesen wollte. Ok so Ausfahrt Ich versuchte, alle meine Befehle zu senden, INKLUSIVE den Befehl exit zuerst, dann lesen. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funktioniert wie ein Zauber. Mein ReadToEnd () gibt einen String in einer halben Sekunde, und ich bekam alle Informationen, die ich brauche. -) Das könnte Ihnen helfen, Gauri. Das Unwahrscheinliche, das Unmögliche dauert nur ein wenig länger. - Steven Parker Marked als Antwort von Jack 321 Montag, 11. August 2008 07:51 ReadToEnd () ist geeignet, Deadlock verursachen, vor allem, wenn Sie es nach einem WaitForExit () oder senden Eine Menge von Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr groß (2KB denke ich). Sie lesen den Inhalt dieses Puffers nicht, sagen wiith ReadLine (), der Prozess wird abwarten und warten, bis der Puffer geleert wird. Ihr Programm wird abgebrochen, da WaitForExit () nie zurückkehren wird, oder der WriteLine () - Aufruf wird gestoppt, da der Prozess nicht mehr gelesen wird. Wenn das Ihr Szenario, youll müssen asynchron mit BeginOutputReadLine () lesen. Hans Passant. Antwort # 2 am: April 12, 2008, 06:48:50 pm »Sie müssen auch Process. StartInfo. UseShellExecute auf false gesetzt. Als Antwort markiert von jack 321 Montag, 11. August 2008 05:43 Die oben genannte Antwort ist eine sehr nette Antwort. Ich denke nicht, dass das quotcmdquot den Strom beendet. Von der cmd-Box wird nichts gesendet, um anzuzeigen, dass der Stream beendet wird. Betrachten Sie eine Webseite, die Sie laden, sobald der gesamte HTML-Code Ihren PC erreicht hat, ist der Stream fertig. Das gleiche mit dem Lesen einer Datei, sobald Sie das letzte Zeichen erreicht haben, ist der Stream fertig. Allerdings mit cmd, ist der Stream nicht quotdonequot. Es wartet nur auf neue Eingabe, dann, wenn Sie ihm einen anderen Befehl geben, wird es Ausgabe wieder haben. Hmm Ich scheine, Probleme zu haben, mich in Englisch wieder auszudrücken, meine Entschuldigungen. Anyways, I dont think theres alles, was Sie tun können, um ReadToEnd () auf einem cmd-output-Stream verwenden, es sei denn, Sie senden es den Befehl quotexitquot. Haben Sie versucht, die readline () mit einem kombinieren. Eine Analyse der Linie (d. h. erhalten Sie leere Zeilen) oder b. Den Process. WaitForIddleInput () - Befehl Das Unwahrscheinliche tun wir, das Unmögliche dauert nur ein wenig länger. - Steven Parker Donnerstag, 7. August 2008 07:35 Uhr Falls Sie cmd Prozess laufen lassen. Remeber, um queryEXITquot in Eingabestream zu schreiben Thursday, August 07, 2008 7:51 AM Also habe ich Manjus-Code kopiert. Myprocesss quotcmd. exequot. Zuerst schickte ich den Befehl quotipconfigquot mit einem readToEnd () Timed out. Versuchtes Lesen in Blöcken, scheiterte auch. Bewährte waitForInputIddle (), aber vergessen, cmd hat keine grafische Benutzeroberfläche, fehlgeschlagen. Also brauchte ich das cmd, um den Stream zu beenden, wenn ich es jemals lesen wollte. Ok so Ausfahrt Ich versuchte, alle meine Befehle zu senden, INKLUSIVE den Befehl exit zuerst, dann lesen. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funktioniert wie ein Zauber. Mein ReadToEnd () gibt einen String in einer halben Sekunde, und ich bekam alle Informationen, die ich brauche. -) Das könnte Ihnen helfen, Gauri. Das Unwahrscheinliche, das Unmögliche dauert nur ein wenig länger. - Steven Parker Marked als Antwort von Jack 321 Montag, 11. August 2008 07:51 ReadToEnd () ist geeignet, Deadlock verursachen, vor allem, wenn Sie es nach einem WaitForExit () oder senden Eine Menge von Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr groß (2KB denke ich). Sie lesen den Inhalt dieses Puffers nicht, sagen wiith ReadLine (), der Prozess wird abwarten und warten, bis der Puffer geleert wird. Ihr Programm wird abgebrochen, da WaitForExit () nie zurückkehren wird, oder der WriteLine () - Aufruf wird gestoppt, da der Prozess nicht mehr gelesen wird. Wenn das Ihr Szenario, youll müssen asynchron mit BeginOutputReadLine () lesen. Hans Passant. Als Antwort markiert von Jack 321 Montag, 11. August 2008 05:44 Uhr 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