Sunday 19 November 2017

Redirectstandarderror Waitforexit C #


Ich habe den folgenden Code: Ich weiß, dass die Ausgabe aus dem Prozess, den ich anfangen, rund 7 MB lang ist. Es läuft in der Windows-Konsole funktioniert gut. Unglücklicherweise hängt das programmgesteuert auf WaitForExit unbegrenzt. Beachten Sie auch dies tut Code nicht hängen für kleinere Ausgänge (wie 3KB). Ist es möglich, dass die internen StandardOutput in ProcessStartInfo cant Puffer 7MB Wenn ja, was sollte ich stattdessen tun Wenn nicht, was mache ich falsch Das Problem ist, dass, wenn Sie StandardOutput umleiten und andor StandardError der interne Puffer kann voll werden. Unabhängig von der Reihenfolge, die Sie verwenden, kann es ein Problem geben: Wenn Sie warten, bis der Prozess beendet wird, bevor Sie StandardOutput lesen, kann der Prozess blockieren und versucht, es zu schreiben. Wenn Sie von StandardOutput mit ReadToEnd lesen, dann kann Ihr Prozess blockieren, wenn der Prozess standardOutput nie schließt (zum Beispiel wenn es nie beendet wird, oder wenn es blockiert ist, schreiben in StandardError). Die Lösung besteht darin, asynchrone Lesevorgänge zu verwenden, um sicherzustellen, dass der Puffer nicht voll wird. Um Deadlocks zu vermeiden und alle Ausgabe von StandardOutput und StandardError zu sammeln, können Sie dies tun: EDIT: Siehe Antworten unten, um das Timeout zu behandeln und Ausnahmen von ObjectDisposeException zu vermeiden. Die Dokumentation für Process. StandardOutput sagt zu lesen, bevor Sie warten, sonst können Sie Deadlock, Snippet kopiert unten: Mark Byers Antwort ist ausgezeichnet, aber ich möchte nur die folgenden hinzufügen: die OutputDataReceived und ErrorDataReceived Delegierten müssen entfernt werden, bevor die outputWaitHandle und errorWaitHandle erhalten Angeordnet sind. Wenn der Prozess weiterhin Daten ausgibt, nachdem die Zeitüberschreitung überschritten wurde und dann beendet wird, wird auf die Variablen outputWaitHandle und errorWaitHandle zugegriffen, nachdem sie entsorgt wurden. (FYI Ich musste diese Einschränkung als Antwort hinzufügen, wie ich konnte nicht auf seinen Beitrag kommentieren.) Wir haben dieses Problem auch (oder eine Variante). Versuchen Sie Folgendes: 1) Fügen Sie ein Timeout zu p. WaitForExit (nnnn) hinzu, wobei nnnn in Millisekunden ist. 2) Legen Sie den ReadToEnd-Aufruf vor dem Aufruf von WaitForExit fest. Dies ist, was weve gesehen MS recommend. System. Diagnostics. ProcessStartInfoClass Assembly: System. dll-Namespace: System. Diagnostics Zusammenfassung Gibt einen Satz von Werten, die beim Starten eines Prozesses verwendet werden. C Syntax: public sealed class ProcessStartInfo Anmerkungen ProcessStartInfo wird zusammen mit der Process-Komponente verwendet. Wenn Sie einen Prozess mit der Process-Klasse starten, haben Sie Zugriff auf Prozessinformationen, die zusätzlich zur Verfügung stehen, wenn Sie an einen laufenden Prozess anhängen. Sie können die ProcessStartInfo-Klasse für eine größere Kontrolle über den Prozess verwenden, den Sie starten. Sie müssen mindestens die ProcessStartInfo. FileName-Eigenschaft festlegen, entweder manuell oder mit dem Konstruktor. Der Dateiname ist eine Anwendung oder ein Dokument. Hier wird ein Dokument als beliebiger Dateityp definiert, der eine offene oder eine standardmäßige Aktion zugeordnet hat. Sie können registrierte Dateitypen und die zugehörigen Anwendungen für Ihren Computer über den Ordneroptionsdialog, der über das Betriebssystem verfügbar ist, anzeigen. Die Schaltfläche Erweitert führt zu einem Dialog, der anzeigt, ob eine offene Aktion zu einem bestimmten registrierten Dateityp gehört. Darüber hinaus können Sie andere Eigenschaften festlegen, die Aktionen definieren, die mit dieser Datei ausgeführt werden sollen. Sie können einen Wert angeben, der für den Typ der Eigenschaft ProcessStartInfo. FileName für die Eigenschaft System. Diagnostics. ProcessStartInfo. Verb (nicht unterstützt für die freigegebene Quell-CLI-Eigenschaft) spezifisch ist. Sie können z. B. für einen Dokumenttyp einen Ausdruck angeben. Darüber hinaus können Sie die Eigenschaften der ProcessStartInfo. Arguments-Eigenschaft als Befehlszeilenargumente angeben, die an die offene Methode der Dateien übergeben werden sollen. Wenn Sie beispielsweise eine Texteditoranwendung in der Eigenschaft ProcessStartInfo. FileName angeben, können Sie die Eigenschaft ProcessStartInfo. Arguments verwenden, um eine Textdatei anzugeben, die vom Editor geöffnet werden soll. Standard-Eingabe ist in der Regel die Tastatur, und Standard-Ausgabe und Fehler sind in der Regel der Monitor-Bildschirm. Sie können jedoch die ProcessStartInfo. RedirectStandardInput verwenden. ProcessStartInfo. RedirectStandardOutput - und ProcessStartInfo. RedirectStandardError - Eigenschaften, um zu bewirken, dass der Prozess Eingaben von einer Datei oder einem anderen Gerät eingibt oder diese zurückgibt. Wenn Sie das Process. StandardInput verwenden. Process. StandardOutput. Oder Process. StandardError-Eigenschaften auf der Process-Komponente, müssen Sie zunächst den entsprechenden Wert auf die ProcessStartInfo-Eigenschaft setzen. Andernfalls wirft das System eine Ausnahme aus, wenn Sie den Stream lesen oder schreiben. Setzen Sie ProcessStartInfo. UseShellExecute, um anzugeben, ob der Prozess mit der Betriebssystem-Shell gestartet werden soll. Sie können den Wert einer beliebigen ProcessStartInfo-Eigenschaft bis zu dem Zeitpunkt ändern, zu dem der Prozess gestartet wird. Nachdem Sie den Prozess gestartet haben, hat die Änderung dieser Werte keine Auswirkung. System. Diagnostics. ProcessStartInfo-Benutzerliste: Standardkonstruktor. Dieser Konstruktor wird von abgeleiteten Klassenkonstruktoren aufgerufen, um den Zustand in diesem Typ zu initialisieren. Initialisiert eine neue Instanz der ProcessStartInfo-Klasse, ohne einen Dateinamen anzugeben, mit dem der Prozess gestartet werden soll. Überladen:.ctor (string fileName) Initialisiert eine neue Instanz der ProcessStartInfo-Klasse und gibt einen Dateinamen wie eine Anwendung oder ein Dokument an, mit dem der Prozess gestartet werden soll. Überladen:.ctor (string fileName, string arguments) Initialisiert eine neue Instanz der ProcessStartInfo-Klasse und gibt einen Anwendungsdateinamen an, mit dem der Prozess gestartet werden soll, sowie einen Satz von Befehlszeilenargumenten, die an die Anwendung übergeben werden. Gest oder legt den Satz von Befehlszeilenargumenten fest, die beim Starten der Anwendung verwendet werden sollen. Ruft Suchpfade für Dateien, Verzeichnisse für temporäre Dateien, anwendungsspezifische Optionen und andere ähnliche Informationen ab. System. Diagnostics. ProcessStartInfo Mitgliedsdetails Überladen ctor 1 Zusammenfassung Initialisiert eine neue Instanz der ProcessStartInfo-Klasse, ohne einen Dateinamen anzugeben, mit dem der Prozess gestartet werden soll. Standardkonstruktor. Dieser Konstruktor wird von abgeleiteten Klassenkonstruktoren aufgerufen, um den Zustand in diesem Typ zu initialisieren. C Syntax: Bemerkungen Sie müssen mindestens die Eigenschaft ProcessStartInfo. FileName festlegen, bevor Sie den Prozess starten. Der Dateiname ist eine Anwendung oder ein Dokument. In diesem Fall wird ein Dokument als beliebiger Dateityp definiert, der eine offene oder eine standardmäßige Aktion zugeordnet hat. Sie können registrierte Dateitypen und die zugehörigen Anwendungen für Ihren Computer über den Ordneroptionsdialog, der über das Betriebssystem verfügbar ist, anzeigen. Die Schaltfläche Erweitert führt zu einem Dialog, der anzeigt, ob eine offene Aktion zu einem bestimmten registrierten Dateityp gehört. Optional können Sie auch andere Eigenschaften festlegen, bevor Sie den Prozess starten. Die System. Diagnostics. ProcessStartInfo. Verb (nicht unterstützt auf der freigegebenen Quell-CLI) - Eigenschaft liefert Aktionen, wie z. B. Drucken, mit der Datei, die in der ProcessStartInfo. FileName-Eigenschaft angegeben wird. Die ProcessStartInfo. Arguments-Eigenschaft bietet eine Möglichkeit, Befehlszeilenargumente an die Datei zu übergeben, wenn das System es öffnet. Überladen ctor 2 Zusammenfassung Initialisiert eine neue Instanz der ProcessStartInfo-Klasse und gibt einen Dateinamen wie eine Anwendung oder ein Dokument an, mit dem der Prozess gestartet werden soll. C Syntax: Eine Anwendung oder ein Dokument, mit dem ein Prozess gestartet wird. Hinweise Der Dateiname ist eine Anwendung oder ein Dokument. In diesem Fall wird ein Dokument als beliebiger Dateityp definiert, der eine offene oder eine standardmäßige Aktion zugeordnet hat. Sie können registrierte Dateitypen und die zugehörigen Anwendungen für Ihren Computer über den Ordneroptionsdialog, der über das Betriebssystem verfügbar ist, anzeigen. Die Schaltfläche Erweitert führt zu einem Dialog, der anzeigt, ob eine offene Aktion zu einem bestimmten registrierten Dateityp gehört. Sie können die ProcessStartInfo. FileName-Eigenschaft ändern, nachdem Sie diesen Konstruktor aufgerufen haben, bis zu dem Zeitpunkt, zu dem der Prozess gestartet wird. Nachdem Sie den Prozess gestartet haben, hat die Änderung dieser Werte keine Auswirkung. Overloaded ctor 3 Zusammenfassung Initialisiert eine neue Instanz der ProcessStartInfo-Klasse und gibt einen Anwendungsdateinamen an, mit dem der Prozess gestartet werden soll, sowie einen Satz von Befehlszeilenargumenten, die an die Anwendung übergeben werden. C Syntax: Eine Anwendung, mit der ein Prozess gestartet wird. Befehlszeilenargumente, die an die Anwendung übergeben werden, wenn der Prozess gestartet wird. Hinweise Der Dateiname ist eine Anwendung oder ein Dokument. In diesem Fall wird ein Dokument als beliebiger Dateityp definiert, der eine offene oder eine standardmäßige Aktion zugeordnet hat. Sie können registrierte Dateitypen und die zugehörigen Anwendungen für Ihren Computer über den Ordneroptionsdialog, der über das Betriebssystem verfügbar ist, anzeigen. Die Schaltfläche Erweitert führt zu einem Dialog, der anzeigt, ob eine offene Aktion zu einem bestimmten registrierten Dateityp gehört. Sie können die Eigenschaften ProcessStartInfo. FileName oder ProcessStartInfo. Arguments ändern, nachdem Sie diesen Konstruktor aufgerufen haben, bis zu dem Zeitpunkt, zu dem der Prozess gestartet wird. Nachdem Sie den Prozess gestartet haben, hat die Änderung dieser Werte keine Auswirkung. Eigenschaft: Argumente (read-write) Zusammenfassung Gest oder setzt den Satz von Befehlszeilenargumenten, die beim Starten der Anwendung verwendet werden sollen. C Syntax: Eigenschaft: EnvironmentVariables (schreibgeschützt) Summary Suchpfade für Dateien, Verzeichnisse für temporäre Dateien, anwendungsspezifische Optionen und andere ähnliche Informationen werden gesammelt. C-Syntax: Eigenschaft: RedirectStandardError (read-write) Zusammenfassung Ruft einen Wert ab, der angibt, ob die Fehlerausgabe des Prozesses in das Process Instances Process. StandardError-Member geschrieben wird, und ermöglicht es Ihnen, an ein anderes Ziel als den Standardfehlerstrom zu schreiben Bildschirm). Dient zum Schreiben von Fehlerdaten in eine Datei oder ein Protokoll. C Syntax: Bemerkungen Die Process-Komponente kommuniziert mit einem Child-Prozess über eine Pipe. Wenn ein untergeordneter Prozess genug Daten an die Pipe schreibt, um den Puffer zu füllen, wird das Kind blockieren, bis das übergeordnete Element die Daten aus der Pipe liest. Dies kann zu einem Deadlock führen, wenn Ihre Anwendung alle Ausgabe auf Standardfehler und Standardausgabe liest, z. B. unter Verwendung des folgenden C-Codes. In diesem Fall würden sowohl der übergeordnete als auch der untergeordnete Prozess blockiert, da die gefüllte Pipe den unterordneten Prozess am Abschluss verhindert, während der übergeordnete Prozess unbegrenzt darauf wartet, dass der untergeordnete Prozess beendet wird. Dieses Problem kann durch Verschieben der ReadToEnd () vor dem WaitForExit () behoben werden. wie folgt. Ein ähnliches Problem tritt auf, wenn Sie sowohl Standard-Ausgabe und Standard-Fehler umleiten und dann versuchen, beide, zum Beispiel mit dem folgenden C-Code zu lesen. Wenn der untergeordnete Prozess einen Text in einen Standardfehler schreibt, wird er den Prozess blockieren, da der übergeordnete Prozess nicht vom Standardfehler lesen kann, bis er von der Standardausgabe beendet worden ist. Der übergeordnete Prozess wird jedoch nicht von der Standardausgabe gelesen, bis der Prozess beendet ist. Eine empfohlene Lösung für diese Situation besteht darin, zwei Threads zu erstellen, damit Ihre Anwendung die Ausgabe jedes Streams auf einem separaten Thread lesen kann. Eigenschaft: RedirectStandardInput (read-write) Zusammenfassung Ruft einen Wert ab, der angibt, ob die Prozeßbefehleingabe aus dem Process Instances Process. StandardInput-Member gelesen wird, und ermöglicht es Ihnen, von einer anderen Quelle als dem Standard-Eingabestrom (in der Regel die Tastatur) zu lesen. Dient zum Lesen von Daten aus einer Datei. C-Syntax: Eigenschaft: RedirectStandardOutput (read-write) Zusammenfassung Ruft einen Wert ab, der angibt, ob die Prozeßausgabe in das Process Instances Process. StandardOutput-Member geschrieben wird, und ermöglicht es Ihnen, an ein anderes Ziel als den Standardausgabestream zu schreiben (in der Regel den Monitor Bildschirm). Dient zum Schreiben von Daten in eine Datei. C Syntax: Bemerkungen Die Process-Komponente kommuniziert mit einem Child-Prozess über eine Pipe. Wenn ein untergeordneter Prozess genug Daten an die Pipe schreibt, um den Puffer zu füllen, wird das Kind blockieren, bis das übergeordnete Element die Daten aus der Pipe liest. Dies kann zu einem Deadlock führen, wenn Ihre Anwendung alle Ausgabe auf Standardfehler und Standardausgabe liest, z. B. unter Verwendung des folgenden C-Codes. In diesem Fall würden sowohl der übergeordnete als auch der untergeordnete Prozess blockiert, da die gefüllte Pipe den unterordneten Prozess am Abschluss verhindert, während der übergeordnete Prozess unbegrenzt darauf wartet, dass der untergeordnete Prozess beendet wird. Dieses Problem kann durch Verschieben der ReadToEnd () vor dem WaitForExit () behoben werden. wie folgt. Ein ähnliches Problem tritt auf, wenn Sie sowohl Standard-Ausgabe und Standard-Fehler umleiten und dann versuchen, beide, zum Beispiel mit dem folgenden C-Code zu lesen. Wenn der untergeordnete Prozess einen Text in einen Standardfehler schreibt, wird er den Prozess blockieren, da der übergeordnete Prozess nicht vom Standardfehler lesen kann, bis er von der Standardausgabe beendet worden ist. Der übergeordnete Prozess wird jedoch nicht von der Standardausgabe gelesen, bis der Prozess beendet ist. Eine empfohlene Lösung für diese Situation besteht darin, zwei Threads zu erstellen, damit Ihre Anwendung die Ausgabe jedes Streams auf einem separaten Thread lesen kann. Eigenschaft: UseShellExecute (read-write) Zusammenfassung Ruft einen Wert ab, der angibt, ob die Betriebssystem-Shell zum Starten des Prozesses verwendet werden soll, oder legt diesen fest. C Syntax: Bemerkungen Wenn Sie diese Eigenschaft auf false setzen, können Sie Input-, Output - und Fehlerquellen umleiten. Wenn Sie die Betriebssystem-Shell zum Starten von Prozessen verwenden, können Sie jedes Dokument (das ist ein registrierter Dateityp, der einer ausführbaren Datei zugeordnet ist und die eine standardmäßige offene Aktion aufweist) starten und Operationen in der Datei wie dem Drucken ausführen Komponente. Wenn ProcessStartInfo. UseShellExecute false ist. Können Sie nur ausführbare Dateien mit der Process-Komponente starten. Eigenschaft: WorkingDirectory (read-write) Zusammenfassung Ruft das Anfangsverzeichnis für den zu startenden Prozess ab oder legt diesen fest. C Syntax: Bemerkungen Wenn das Verzeichnis bereits Bestandteil der Systempfadvariablen ist, ist es nicht notwendig, den Verzeichnisstandort in dieser Eigenschaft zu wiederholen.

No comments:

Post a Comment