Freigeben über


Process.StandardOutput-Eigenschaft

Ruft einen Stream ab, mit dem die Ausgabe der Anwendung gelesen wird.

Namespace: System.Diagnostics
Assembly: System (in system.dll)

Syntax

'Declaration
Public ReadOnly Property StandardOutput As StreamReader
'Usage
Dim instance As Process
Dim value As StreamReader

value = instance.StandardOutput
public StreamReader StandardOutput { get; }
public:
property StreamReader^ StandardOutput {
    StreamReader^ get ();
}
/** @property */
public StreamReader get_StandardOutput ()
public function get StandardOutput () : StreamReader

Eigenschaftenwert

Ein StreamReader zum Lesen des Standardausgabestreams der Anwendung.

Ausnahmen

Ausnahmetyp Bedingung

InvalidOperationException

Der StandardOutput-Stream wurde nicht für die Umleitung definiert. Stellen Sie sicher, dass ProcessStartInfo.RedirectStandardOutput auf true und ProcessStartInfo.UseShellExecute auf false festgelegt ist.

– oder –

Der StandardOutput-Stream ist mit BeginOutputReadLine für asynchrone Lesevorgänge geöffnet worden.

Hinweise

Wenn ein Process Text in seinen Standardstream schreibt, wird dieser Text normalerweise in der Konsole angezeigt. Durch Umleiten des StandardOutput-Streams können Sie die Ausgabe eines Prozesses bearbeiten oder unterdrücken. Beispielsweise können Sie den Text filtern oder anders formatieren oder die Ausgabe sowohl in die Konsole als auch in eine festgelegte Protokolldatei schreiben.

Hinweis

Zum Verwenden von StandardOutput müssen Sie ProcessStartInfo.UseShellExecute auf false und ProcessStartInfo.RedirectStandardOutput auf true festlegen. Andernfalls löst das Lesen aus dem StandardOutput-Stream eine Ausnahme aus.

Der umgeleitete StandardOutput-Stream kann synchron oder asynchron gelesen werden. Methoden wie Read, ReadLine und ReadToEnd führen synchrone Lesevorgänge im Ausgabestream des Prozesses aus. Diese synchronen Lesevorgänge werden erst beendet, wenn der zugeordnete Process Daten in den StandardOutput-Stream schreibt oder den Stream schließt.

Im Gegensatz dazu startet BeginOutputReadLine asynchrone Lesevorgänge im StandardOutput-Stream. Mit dieser Methode wird ein bestimmter Ereignishandler für die Streamausgabe aktiviert und eine unmittelbare Rückgabe an den Aufrufer übergeben, der andere Aufgaben durchführen kann, während die Streamausgabe an den Ereignishandler geleitet wird.

Synchrone Lesevorgänge verursachen eine Abhängigkeit zwischen dem Aufrufer, der aus dem StandardOutput-Stream liest, und dem untergeordneten Prozess, der in diesen Stream schreibt. Diese Abhängigkeiten können zu Deadlockbedingungen führen. Wenn der Aufrufer aus dem umgeleiteten Stream eines untergeordneten Prozesses liest, ist er vom untergeordneten Element abhängig. Der Aufrufer wartet auf den Lesevorgang, bis das untergeordnete Element in den Stream schreibt oder den Stream schließt. Wenn der untergeordnete Prozess genug Daten schreibt, um seinen umgeleiteten Stream zu füllen, ist er vom übergeordneten Element abhängig. Der untergeordnete Prozess wartet mit dem nächsten Schreibvorgang, bis das übergeordnete Element aus dem gefüllten Stream liest oder den Stream schließt. Die Deadlockbedingung tritt ein, wenn der Aufrufer und der untergeordnete Prozess jeweils auf Beendigung eines Vorgangs warten und ein Fortfahren für beide nicht möglich ist. Sie können Deadlocks vermeiden, indem Sie Abhängigkeiten zwischen dem Aufrufer und dem untergeordnetem Prozess auswerten.

Der folgende C#-Code zeigt beispielsweise, wie aus einem umgeleiteten Stream gelesen und auf das Beenden des untergeordneten Prozesses gewartet wird.

 // Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();

Im Codebeispiel wird eine Deadlockbedingung vermieden, indem p.StandardOutput.ReadToEnd vor p.WaitForExit aufgerufen wird. Eine Deadlockbedingung kann eintreten, wenn der übergeordnete Prozess p.WaitForExit vor p.StandardOutput.ReadToEnd aufruft und der untergeordnete Prozess genug Text zum Füllen des umgeleiteten Streams schreibt. Der übergeordnete Prozess würde unbegrenzt auf das Beenden des untergeordneten Prozesses warten. Der untergeordnete Prozess würde unbegrenzt warten, bis das übergeordnete Element aus dem vollen StandardOutput-Stream liest.

Es gibt ein ähnliches Problem, wenn Sie sämtlichen Text sowohl aus der Standardausgabe als auch aus Standardfehlerstreams lesen. Der folgende C#-Code führt z. B. einen Lesevorgang in beiden Streams aus.

 // Do not perform a synchronous read to the end of both 
 // redirected streams.
 // string output = p.StandardOutput.ReadToEnd();
 // string error = p.StandardError.ReadToEnd();
 // p.WaitForExit();
 // Use asynchronous read operations on at least one of the streams.
 p.BeginOutputReadLine();
 string error = p.StandardError.ReadToEnd();
 p.WaitForExit();

Im Codebeispiel wird die Deadlockbedingung vermieden, indem asynchrone Lesevorgänge im StandardOutput-Stream ausgeführt werden. Eine Deadlockbedingung tritt ein, wenn der übergeordnete Prozess p.StandardOutput.ReadToEnd vor p.StandardError.ReadToEnd aufruft und der untergeordnete Prozess genug Text zum Füllen des Fehlerstreams schreibt. Der übergeordnete Prozess würde unbegrenzt warten, damit der untergeordnete Prozess seinen StandardOutput-Stream schließt. Der untergeordnete Prozess würde unbegrenzt warten, bis das übergeordnete Element aus dem vollen StandardError-Stream liest.

Sie können asynchrone Lesevorgänge verwenden, um diese Abhängigkeiten und ihr Deadlockpotenzial zu vermeiden. Die Deadlockbedingung kann auch vermieden werden, indem zwei Threads erstellt werden und die Ausgabe der einzelnen Streams in separaten Threads gelesen wird.

Hinweis

Sie können keine asynchronen und synchronen Lesevorgänge in einem umgeleiteten Stream kombinieren. Wenn der umgeleitete Stream eines Process im asynchronen oder synchronen Modus geöffnet wird, müssen alle weiteren Lesevorgänge in diesem Stream in demselben Modus ausgeführt werden. Rufen Sie z. B. nach BeginOutputReadLine nicht ReadLine für den StandardOutput-Stream auf oder umgekehrt. Sie können jedoch zwei verschiedene Streams in unterschiedlichen Modi lesen. Beispielsweise können Sie BeginOutputReadLine aufrufen und dann ReadLine für den StandardError-Stream aufrufen.

Beispiel

Im folgenden Beispiel wird eine neue benutzerdefinierte ausführbare Datei erstellt und die Standardausgabe gelesen. Die Ausgaben werden dann auf der Konsole angezeigt.

Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo("Process_StandardOutput_Sample.exe")
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()

Dim myStreamReader As StreamReader = myProcess.StandardOutput
' Read the standard output of the spawned process.
Dim myString As String = myStreamReader.ReadLine()
Console.WriteLine(myString)
myProcess.Close()
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("Process_StandardOutput_Sample.exe" );
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardOutput = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();

StreamReader myStreamReader = myProcess.StandardOutput;
// Read the standard output of the spawned process.
string myString = myStreamReader.ReadLine();
Console.WriteLine(myString);
myProcess.Close();
Process^ myProcess = gcnew Process;
ProcessStartInfo^ myProcessStartInfo = gcnew ProcessStartInfo(
   "Process_StandardOutput_Sample.exe" );
myProcessStartInfo->UseShellExecute = false;
myProcessStartInfo->RedirectStandardOutput = true;
myProcess->StartInfo = myProcessStartInfo;
myProcess->Start();

StreamReader^ myStreamReader = myProcess->StandardOutput;
// Read the standard output of the spawned process.
String^ myString = myStreamReader->ReadLine();
Console::WriteLine( myString );
myProcess->Close();

.NET Framework-Sicherheit

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

Process-Klasse
Process-Member
System.Diagnostics-Namespace
Process.StandardInput-Eigenschaft
Process.StandardError-Eigenschaft
ProcessStartInfo.RedirectStandardOutput