Tuesday 2 May 2017

Prozess Waitforexit Standardausgang

Ihre Lösung braucht nicht AutoResetEvent aber Sie poll. 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. Antwort # 2 am: Juli 13, 2010, um 10:35 Uhr Usage Beispiel ImplementationSystem. Diagnostics. Process: umleiten StandardInput, StandardOutput, StandardError 82218217 InputAndOutputToEnd: eine praktische Möglichkeit, 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 erwähnt löst 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 Möglichkeit zu überprüfen. 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 für zwei Module, aber das dritte Modul sperrt, wenn ich das RedirectStandardOutput true gesetzt. Ich kann jedes der Fortran Programme von der Befehlszeile ausführen, 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 für die Antwort. Ich schlage vor, Sie lesen die Bemerkungen Abschnitt der Process. StandardOuput-Eigenschaft: Deadlock-Bedingung kann resultieren, wenn der übergeordnete Prozess p. WaitForExit aufruft, bevor p. StandardOutput. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um den umgeleiteten Stream zu füllen. Der übergeordnete Prozess würde unendlich warten, bis der untergeordnete Prozess beendet wird. Der untergeordnete Prozess würde unbegrenzt warten, damit das übergeordnete Element aus dem vollständigen StandardOutput stream. quot lesen kann. Hier ist die Dokumentation. Es enthält auch Informationen über 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 läuft gut, wenn die Standard-Ausgabe nicht umgeleitet wird, aber hängt, 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 für 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 für 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 für die Wrapper, die Sie schreiben, und wie sich der Code, den Sie für den Wrapper für das dritte Modul verwendet haben, unterscheidet sich von dem Code, den Sie für die Wrapper für die beiden anderen Module verwendet haben Tuesday, February 02, 2010 3:17 AM Wir können einfach nicht helfen, wenn wir nicht sehen, ein Stück Code, der falsch geht. Die Umleitung des Prozessstarts wird quittiert, aber ohne Code können 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 ausführen, ist der zweite Abschnitt GENERATE WALL DATA was Schlägt fehl. Wenn ich proc. StartInfo. RedirectStandardOutput false in der mit ihm markierten Zeile setze, wie erwartet. Das Ausführen des wallgen-Moduls direkt über die Befehlszeile und das Umleiten der Ausgabe in eine Datei funktioniert ok. Mein nächster Gedanke ist, einen sekundären Befehlsprozessor zu starten und starten Sie die ausführbare Datei von dort oder vielleicht eine Batch-Datei. Diese beiden Optionen sind ein wenig kludgy Id eher wissen, warum dies nicht funktioniert :-) Public Sub Ausführen () 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 Tötung (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 für 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 Tötung (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 für 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 übergeordnete Prozess p. WaitForExit aufruft, bevor p. StandardOutput. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um den umgeleiteten Stream zu füllen. Der übergeordnete Prozess würde unendlich warten, bis der untergeordnete Prozess beendet wird. Der untergeordnete Prozess würde unbegrenzt warten, damit das übergeordnete Element aus dem vollständigen StandardOutput stream. quot lesen kann. Hier ist die Dokumentation. Es enthält auch Informationen über 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, fühlen 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 für Ihre freundliche Hilfe und Unterstützung. 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 Rückgespräch haben, bitte erklären Sie uns. Freitag, 5. Februar 2010 um 9:35 Uhr


No comments:

Post a Comment