C # Prozess Waitforexit Readtoend

Ich habe ein Programm, das häufig verwendet ein externes Programm und liest seine Ausgänge. Es funktioniert ziemlich gut mit Ihrem üblichen Prozess redirect Ausgang, aber ein bestimmtes Argument aus irgendeinem Grund hängt, wenn ich versuche, es zu lesen, keine Fehlermeldung - keine Ausnahme, es nur stoppt, wenn es diese Zeile erreicht. Ich nutze natürlich eine zentrale Funktion, um die Ausgabe aus dem Programm aufzurufen und zu lesen, was folgendermaßen aussieht: Die Zeile, die hängt, ist das Ergebnis proc. StandardOutput. ReadToEnd (). Aber wieder, nicht jedes Mal, nur wenn gesendet ein bestimmtes Argument (Start-Server). Alle anderen Argumente funktionieren gut - es liest den Wert und gibt es zurück. Es ist auch seltsam, wie es hängt. Es friert nicht ein oder gibt einen Fehler oder nichts, es stoppt nur die Verarbeitung. Als ob es ein Rückgabebefehl war, außer es nicht sogar zur aufrufenden Funktion zurückkehrt, stoppt es gerade alles mit der Schnittstelle noch und läuft. Jedermann erlebt dies vor Jedermann haben eine Idee, was ich versuchen sollte Im Annehmen seiner etwas Unerwartetes innerhalb des Streams selbst, aber es gibt eine Weise, die ich handleignore dies, so dass es liest es trotzdem gefragt werden kann In der Konsole das gleiche Programm mit denselben Parametern. Es ist es für Benutzer-Interaktion wie Eingabe von Passwort oder congirmation nach Warnungen aufgefordert, könnte es die Ursache sein. Zum Beispiel hängt pgAdmin (postgress database admiinistration) nach Passwort für Datenbanken, die sich nicht in seiner Konfigurationsdatei befinden. Aber dies kann nur gesehen werden, aus der Konsole ndash Profimedica Proposed Lösungen mit BeginOutputReadLine () sind ein guter Weg, aber in Situationen wie, dass es nicht anwendbar ist, weil Prozess (sicherlich mit der Verwendung von WaitForExit ()), Exits vor der asynchronen Ausgabe vollständig beendet. Also, ich versuchte, es synchron zu implementieren und festgestellt, dass die Lösung ist mit Peek () Methode aus StreamReader-Klasse. Ich habe hinzugefügt check für Peek () gt -1, um sicherzustellen, dass es nicht das Ende des Streams wie in MSDN-Artikel beschrieben und schließlich funktioniert es und hängt hängen Hier ist der Code: Ändern und mein Prozess ist immer noch auf den Prozess hängen. StandardError. ReadLine (). Ndash ganders Ganders kann Ihr process. StandardError. ReadLine () zurückgibt null ndash Fedor Jun 13 13 at 21:33 Ich versuche, dass zu überprüfen und lassen Sie es wissen. Ndash ganders Ich habe es behoben, aber ich implementiert etwas, das jemand anderes aus einer anderen Frage beantwortet, hier39s der Link auf die Antwort, die ich verwendet: stackoverflowquestions139593hellip ndash ganders Vielen Dank für Ihre Antwort . I39m Angst dies didn39t Arbeit, es noch hing, sobald es zu 39StandardError. ReadToEnd () 39 bekam. Ich habe sogar versucht mit 39BeginErrorReadLine () 39 aber das hing auch. Das einzige, was DID Arbeit war das Hinzufügen einer Timeout zu 39WaitForExit39. Da dieses spezifische Argument, das hängt, immer eine Ausgabe fast sofort gibt, habe ich es bei etwa 3 Sekunden zeitlich abgestimmt und alles funktioniert einwandfrei. It39s nicht sehr elegant, aber es funktioniert. Nochmals vielen Dank für die Hilfe. Ndash Elad Avron Aug 25 11 at 8:17 Ich hatte das gleiche Deadlock Problem. Dieses Code-Snippet hat für mich gearbeitet. Ich habe die gleiche Art von Problem, dass Fehler war nur hängen. Basierend auf Ihrer Antwort auf Daniel Hilgarth Ich habe nicht einmal versuchen, mit diesen Codes obwohl ich glaube, sie hätten für mich gearbeitet. Da ich in der Lage, einige fancier Ausgang noch irgendwann habe ich beschlossen, dass ich es mit beiden der Ausgänge in einem Hintergrund-Thread getan. Dieses arbeitete für mich und erlaubte mir, nicht eine Zeitüberschreitung für das Lesen zu verwenden. Antwort # 1 am: April 13, 2010, 06:39:23 am »Etwas, das elegant ist und für mich gearbeitet ist: Diese Antwort fand ich hier und der Trick ist mit Flush () und Schließen () auf Standard-Eingabe. Die Antwort akzeptiert Lösung nicht für mich arbeiten. Ich hatte, um Aufgaben zu verwenden, um die Deadlock zu vermeiden: Mit einer GetStreamOutput-Funktion wie folgt: beantwortet nur für den Fall, dass jemand stolpert auf diese Frage während der Verwendung von Windows Forms und TextBox (oder RichTextBox) zu zeigen, die Fehler und gibt den Prozess in Echtzeit zurück (wie sie in process. StandardOutput process. StandardError geschrieben werden). Sie müssen OutputDataReceived () ErrorDataReceived () verwenden, um beide Streams ohne Deadlocks zu lesen, es gibt keine Möglichkeit (soweit ich weiß), um Deadlocks sonst zu vermeiden, auch Fedors Antwort, die jetzt das Antwort-Tag hält und das am meisten mag Bis heute, macht nicht den Trick für mich. Allerdings, wenn Sie die RichTextBox (oder TextBox) verwenden, um die Daten auszugeben, ein weiteres Problem, das Sie begegnen ist, wie Sie tatsächlich schreiben die Daten in das Textfeld in Echtzeit (sobald es ankommt). Sie erhalten den Zugriff auf die Daten in einem der Hintergrund-Threads OutputDataReceived () ErrorDataReceived () und Sie können nur AppendText () aus dem Haupt-Thread. Was ich zuerst versucht habe, rief process. Start () von einem Hintergrundthread auf und rief dann BeginInvoke () gt AppendText () in OutputDataReceived () ErrorDataReceived () auf, während der Hauptthread process. WaitForExit () war. Allerdings führte dies zu meiner Form Einfrieren und schließlich hängen für die Ewigkeit. Nach ein paar Tagen versuchte ich am Ende mit der Lösung unten, das scheint ziemlich gut zu funktionieren. Kurz gesagt, müssen Sie die Nachrichten in eine gleichzeitige Sammlung in OutputDataReceived () ErrorDataReceived () Threads hinzufügen, während der Hauptthread sollte ständig versuchen, Nachrichten aus dieser Sammlung zu extrahieren und fügen Sie sie in die Textbox: Der einzige Nachteil dieser Ansatz ist die Tatsache Dass Sie Nachrichten in einem sehr seltenen Fall lösen können, wenn der Prozess beginnt, sie zwischen process. Start () und process. BeginErrorReadLine () process. BeginOutputReadLine () zu schreiben. Nur halten, dass im Auge. Der einzige Weg, um zu vermeiden, dass die vollständige Streams zu lesen und (oder) Zugang zu ihnen nur, wenn der Prozess beendet ist. Ich habe eine C-Konsole-Anwendung, die eine Befehlszeile 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 zur Konsole benötige. Aber wenn Process. StartInfo. RedirectStandardOutput true, ich bin nicht immer die gewünschte Ausgabe mit der Anweisung Process. StandardOutput. ReadToEnd (). Split (n), während ReadLine Option funktioniert gut und ich bekomme die erste Zeile des Textes angezeigt. Da jedes Mal die Daten, die ich auf der Konsole unterscheide, unterscheiden sich, kann ich nicht hardcode jede spezifische Loaction von wo ich meine Ausgabe zu 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, 7. August 2008 5:44 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. Getestet waitForInputIddle (), aber vergessen, dass cmd keine grafische Schnittstelle hat, scheiterte auch. 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, 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 Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr groß (2KB denke ich). Es Sie nicht lesen den Inhalt dieses Puffers, sagen wiith ReadLine (), wird der Prozess abwarten, warten, bis der Puffer geleert werden. 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:12:50 pm »Sie müssen auch Process. StartInfo. UseShellExecute auf false gesetzt. Als Antwort markiert von jack 321 Montag, August 11, 2008 5:43 AM Die oben ist eine sehr schöne Standard-Antwort, aber. Ich denke nicht, dass das quotcmdquot den Stream 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 beim 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, August 07, 2008 7:35 AM Wenn Sie cmd Prozess laufen. Remeber, um quotEXITquot 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. Getestet waitForInputIddle (), aber vergessen, dass cmd keine grafische Schnittstelle hat, scheiterte auch. 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, dann lesen. sIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) string strOutput sOut. ReadToEnd () funktioniert wie ein Charme. Meine 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 Als Antwort von Jack 321 Montag, 11. August 2008 05.44 Uhr Donnerstag, 7. August 2008 07.51 ReadToEnd () geeignet ist, Deadlock zu verursachen, vor allem, wenn Sie es nach einem WaitForExit-Code () oder schicken Eine Menge von Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr groß (2KB denke ich). Es Sie nicht lesen den Inhalt dieses Puffers, sagen wiith ReadLine (), wird der Prozess abwarten, warten, bis der Puffer geleert werden. 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 eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen


Comments

Popular posts from this blog

Divergenz Forexworld

Optionen Dividenden Handel

Trading Forex Mit Preis Aktion