Prozess Waitforexit Standardausgang




Prozess Waitforexit StandardausgangIhre Losung braucht nicht AutoResetEvent aber Sie poll. Wenn Sie die Umfrage statt der Verwendung von Event (wenn sie verfugbar sind), dann sind Sie mit CPU ohne Grund und dass zeigen, dass Sie ein schlechter Programmierer sind. Ihre Losung 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 wurde jedoch unter Windows 8, aber nicht unter Windows 7 auftreten. Die folgende Zeile scheint das Problem verursacht haben. Die Losung war NICHT deaktivieren UseShellExecute. Ich erhielt nun ein Shell-Popup-Fenster, das unerwunscht ist, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fugte ich die folgende Arbeit-um fur das hinzu: Jetzt das einzige, das mich stort, ist, warum dieses geschieht unter Windows 8 an erster Stelle. Antwort # 2 am: Juli 13, 2010, um 10:35 Uhr Usage Beispiel ImplementationSystem. Diagnostics. Process: umleiten StandardInput, StandardOutput, StandardError 82218217 InputAndOutputToEnd: eine praktische Moglichkeit, umgeleitete Eingabe / Ausgabe / Fehler auf einem p. 82218217 ltparam name8221p8221gtDie p umzuleiten. Muss UseShellExecute auf false. lt/paramgt setzen 82218217 ltparam name8221StandardInput8221gtDiese Zeichenfolge wird als Eingabe an das p gesendet. (Muss nichts sein, wenn nicht StartInfo. RedirectStandardInput) lt / paramgt 82218217 ltparam name8221StandardOutput8221gtDie Ausgabe von p8217s wird in dieser ByRef-Zeichenfolge gesammelt. (Muss nichts sein, wenn nicht StartInfo. RedirectStandardOutput) lt / paramgt 82218217 ltparam name8221StandardError8221gtDer p8217s-Fehler wird in dieser ByRef-Zeichenfolge gesammelt. (Muss nichts sein, wenn nicht StartInfo. RedirectStandardError) lt / paramgt 82.218.217 ltremarksgtThis Funktion des Deadlock-Problem bei msdn. microsoft/en-us/library/system. diagnostics. p.standardoutput. aspxlt/remarksgt ltRuntimepilerServices. Extension () gt Sub erwahnt lost InputAndOutputToEnd (ByVal p Als Diagnostics. Process, ByVal StandardInput As String. ByRef StandardOutput As String. ByRef Standarderror As String) Wenn p Is Nothing Dann New Argument Werfen (8220p muss nicht null8221 sein) 8216 Angenommen p begonnen hat. Leider gibt es keine Moglichkeit zu uberprufen. Wenn p. StartInfo. UseShellExecute dann werfen New Argument (8220Set StartInfo. UseShellExecute zu false8221) If (p. StartInfo. RedirectStandardInput ltgt (StandardInput IsNot Nothing)) Dann werfen New Argument (8220Provide eine Nicht-Null-Eingabe nur, wenn StartInfo. RedirectStandardInput8221) Wenn (p. StartInfo. RedirectStandardOutput ltgt (StandardOutput IsNot Nothing)) Dann werfen New Argument (8220Provide eine nicht-null-Ausgang nur, wenn StartInfo. RedirectStandardOutput8221) If (p. StartInfo. RedirectStandardError ltgt (Standarderror IsNot Nothing)) Dann New Wurf Argument (8220Provide ein nicht-null-Fehler nur, wenn StartInfo. RedirectStandardError8221) Dim Ausgabedaten als neue InputAndOutputToEndData Dim Errordata As New InputAndOutputToEndData Wenn p. StartInfo. RedirectStandardOutput ThenIm ein VB. NET-Wrapper um einige alte Fortran-Code (3 exe-Module) zu schreiben. Die Verwendung der Process. StartInfo. RedirectStandardOutput funktioniert fur zwei Module, aber das dritte Modul sperrt, wenn ich das RedirectStandardOutput true gesetzt. Ich kann jedes der Fortran Programme von der Befehlszeile ausfuhren, die sogar ihre Standardausgabe zu einer Akte mit dem DOS Umleitung gt Befehl umadressiert. Sie sind in eine Falle, die dokumentiert ist - Aufruf WaitForExit vor ReadToEnd fallen. Danke fur die Antwort. Ich schlage vor, Sie lesen die Bemerkungen Abschnitt der Process. StandardOuput-Eigenschaft: Deadlock-Bedingung kann resultieren, wenn der ubergeordnete Prozess p. WaitForExit aufruft, bevor p. StandardOutput. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um den umgeleiteten Stream zu fullen. Der ubergeordnete Prozess wurde unendlich warten, bis der untergeordnete Prozess beendet wird. Der untergeordnete Prozess wurde unbegrenzt warten, damit das ubergeordnete Element aus dem vollstandigen StandardOutput stream. quot lesen kann. Hier ist die Dokumentation. Es enthalt auch Informationen uber die Vermeidung dieser Situation. HTH Tom Shelton Vorgeschlagen als Antwort von Cor Ligthert MVP Dienstag, 2. Februar 2010 18:06 Uhr Als Antwort markiert von MartinXie Moderator Montag, den 08. Februar 2010 um 15:12 Uhr Alle Antworten Most probable , Schrieben Sie etwas falsch in Ihrem Code in diesem dritten Modul. Ich glaube nicht, dass es in der. Exe-Modul sein, dh es lauft gut, wenn die Standard-Ausgabe nicht umgeleitet wird, aber hangt, wenn ich den Prozess gesetzt. Startinfo. RedirectStandardOutput TRUE. Und da es funktioniert mit DOS-Umleitung (dh C: gtmodule3.exe gt output. txt generiert die erwartete output. txt-Datei), nehme ich das Problem mit Umleitung ist spezifisch fur die Art und Weise. NET ist das Erstellen des Prozesses im Vergleich zu es aus dem Befehl Linie. Ich nehme an, das Problem mit Redirection ist spezifisch fur die Art und Weise. NET ist das Erstellen des Prozesses im Vergleich zu es aus der Befehlszeile. Das ist unter Ihrer Kontrolle. Was ist der Code fur die Wrapper, die Sie schreiben, und wie sich der Code, den Sie fur den Wrapper fur das dritte Modul verwendet haben, unterscheidet sich von dem Code, den Sie fur die Wrapper fur die beiden anderen Module verwendet haben Tuesday, February 02, 2010 3:17 AM Wir konnen einfach nicht helfen, wenn wir nicht sehen, ein Stuck Code, der falsch geht. Die Umleitung des Prozessstarts wird quittiert, aber ohne Code konnen wir besser zu einem Cassino gehen. Allerdings, hier ein Beispiel, dass auf unserer Website vb-Tipps / Shell. aspx Success Cor Tuesday, February 02, 2010 7:30 AM Der Code unten wird verwendet, um zwei der drei Module ausfuhren, ist der zweite Abschnitt GENERATE WALL DATA was Schlagt fehl. Wenn ich proc. StartInfo. RedirectStandardOutput false in der mit ihm markierten Zeile setze, wie erwartet. Das Ausfuhren des wallgen-Moduls direkt uber die Befehlszeile und das Umleiten der Ausgabe in eine Datei funktioniert ok. Mein nachster Gedanke ist, einen sekundaren Befehlsprozessor zu starten und starten Sie die ausfuhrbare Datei von dort oder vielleicht eine Batch-Datei. Diese beiden Optionen sind ein wenig kludgy Id eher wissen, warum dies nicht funktioniert :-) Public Sub Ausfuhren () Dim fs Als System. IO. Stream Dim proc Als neue Prozess Dim szResult As String Dim szPath As String GENERATE BALL DATA szPath Me. WorkingDir amp My. Settings. BallGenResultFile Wenn Me. KillBeforeExecute dann versuchen Totung (szPath) Fang ex als FileNotFoundException Ignorieren Datei nicht gefunden Ausnahme End End Try Wenn fs GetFileStream (My. Settings. BallGenFile) msim. CreateBallGenFile (fs) proc. StartInfo. FileName Mein. Settings. BallGenExec proc. StartInfo. WorkingDirectory Me. WorkingDir proc. StartInfo. UseShellExecute Falsch proc. StartInfo. CreateNoWindow Wahre proc. StartInfo. RedirectStandardOutput Wahre proc. Start () If Not proc. WaitForExit (My. Settings. BallGenTimeout) Dann proc. Kill () Werfen New MsExecuteException (My. Settings. BallGenModule, quotTimeout fur BallGen warten executionquot zu beenden) End If If String pare (szResult. Trim, My. Settings. BallGenNormalExit. Trim, True) ltgt 0 Werfen Sie dann New MsExecuteException (My. Settings. BallGenModule, szResult) End If If Not System. IO. File. Exists (szPath) Then New MsExecuteException Werfen (My. Settings. BallGenModule, quotThe BallGen Ergebnisdatei wurde nicht createdquot) End If BALL GEN ERFOLGREICH WALL DATA szPath Me GENE. WorkingDir amp My. Settings. WallGenResultFile Wenn Me. KillBeforeExecute dann versuchen Totung (szPath) Fang ex als FileNotFoundException Ignorieren Datei nicht gefunden Ausnahme, werfen alle anderen Ausnahmen End End Try Wenn fs GetFileStream (My. Settings. WallGenFile) msim. CreateWallGenFile (fs ) proc Neuer Prozess proc. StartInfo. FileName Mein. Settings. WallGenExec proc. StartInfo. CreateNoWindow Wahre proc. StartInfo. WorkingDirectory Me. WorkingDir proc. StartInfo. UseShellExecute Falsch proc. StartInfo. RedirectStandardOutput Wahre proc. StartInfo. RedirectStandardError Wahre proc. Start ( If) Nicht proc. WaitForExit (My. Settings. WallGenTimeout) Dann proc. Kill () Werfen New MsExecuteException (My. Settings. WallGenModule, quotTimeout fur WallGen warten executingquot bis Ende) End If szResult proc. StandardOutput. ReadToEnd If Not System. IO. File. Exists (szPath) Dann werfen neue MsExecuteException (My. Settings. WallGenModule, die WallGen Ergebnisdatei wurde nicht erstellt) End If WALL GEN ERFOLGREICH End Sub Tuesday, February 02, 2010 5:14 PM Sie fallen in eine Falle, die Ist dokumentiert - Aufruf WaitForExit vor ReadToEnd. Ich schlage vor, Sie lesen die Bemerkungen Abschnitt der Process. StandardOuput-Eigenschaft: Deadlock-Bedingung kann resultieren, wenn der ubergeordnete Prozess p. WaitForExit aufruft, bevor p. StandardOutput. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um den umgeleiteten Stream zu fullen. Der ubergeordnete Prozess wurde unendlich warten, bis der untergeordnete Prozess beendet wird. Der untergeordnete Prozess wurde unbegrenzt warten, damit das ubergeordnete Element aus dem vollstandigen StandardOutput stream. quot lesen kann. Hier ist die Dokumentation. Es enthalt auch Informationen uber die Vermeidung dieser Situation. HTH Tom Shelton Vorgeschlagen als Antwort von Cor Ligthert MVP Dienstag, 2. Februar 2010 17:06 Uhr Als Antwort markiert von MartinXie Moderator Dienstag, 2. Februar 2010 17:30 Uhr Willkommen zu MSDN Foren Tut diese Hilfe Wenn Sie irgendwelche weiteren Fragen oder Interessen haben, fuhlen Sie bitte sich frei, uns zu informieren. Au?erdem, hier ist ein Artikel demonstriert: Wie Umleiten Standard-Eingabe-Ausgabe einer Anwendung in. NET-Codeprojekt / KB / cs / ProcessStartDemo. aspx Vielen Dank fur Ihre freundliche Hilfe und Unterstutzung. Wenn Sie Feedback zu unserem Support haben, wenden Sie sich bitte an msdnmgmicrosoft Bitte denken Sie daran, die Antworten als Antworten markieren, wenn sie helfen und markieren sie, wenn sie keine Hilfe bieten. Willkommen im All-In-One Code Framework. Wenn Sie irgendein Ruckgesprach haben, bitte erklaren Sie uns. Freitag, 5. Februar 2010 um 9:35 Uhr