Exportar (0) Imprimir
Expandir todo

Process.StandardOutput (Propiedad)

Obtiene una secuencia utilizada para leer la salida de la aplicación.

Espacio de nombres: System.Diagnostics
Ensamblado: System (en system.dll)

public StreamReader StandardOutput { get; }
/** @property */
public StreamReader get_StandardOutput ()

public function get StandardOutput () : StreamReader

Valor de propiedad

Un StreamReader que puede utilizarse para leer la secuencia de salida estándar de la aplicación.

Tipo de excepciónCondición

InvalidOperationException

No se ha definido el redireccionamiento de la secuencia de StandardOutput; asegúrese de que el valor de ProcessStartInfo.RedirectStandardOutput esté establecido en true y que el valor de ProcessStartInfo.UseShellExecute esté establecido en false.

O bien

Se ha abierto la secuencia de StandardOutput para operaciones de lectura asincrónica con BeginOutputReadLine.

Cuando un Process escribe texto en la secuencia estándar, dicho texto se muestra normalmente en la consola. Si se redirige la secuencia de StandardOutput, se puede manipular o suprimir el resultado de un proceso. Por ejemplo, se puede filtrar el texto, aplicarle otro formato o escribir el resultado en la consola y en un archivo de registro designado.

NotaNota

Para usar StandardOutput, es preciso establecer el valor de ProcessStartInfo.UseShellExecute en false y el valor de ProcessStartInfo.RedirectStandardOutput en true. De lo contrario, al leer la secuencia de StandardOutput, se produce una excepción.

La secuencia de StandardOutput redirigida puede leerse de manera sincrónica o asincrónica. Los métodos como Read, ReadLine y ReadToEnd realizan operaciones de lectura sincrónica en la secuencia de salida del proceso. Estas operaciones de lectura sincrónica no terminan hasta que el Process asociado escribe en la secuencia de StandardOutput o cierra la secuencia.

Por contraste, BeginOutputReadLine inicia las operaciones de lectura asincrónica en la secuencia de StandardOutput. Este método habilita un controlador de eventos designado para los resultados de la secuencia y vuelve inmediatamente al llamador, que puede realizar otro trabajo mientras los resultados de la secuencia se dirigen al controlador de eventos.

Las operaciones de lectura sincrónica introducen una dependencia entre el llamador que lee de la secuencia de StandardOutput y el proceso secundario que escribe en esa secuencia. Estas dependencias pueden generar condiciones de interbloqueo. Cuando el llamador lee la secuencia redirigida de un proceso secundario, depende del proceso secundario. El llamador espera la operación de lectura hasta que el proceso secundario escribe en la secuencia o cierra la secuencia. Cuando el proceso secundario escribe suficientes datos para rellenar su secuencia redirigida, depende del proceso principal. El proceso secundario espera la siguiente operación de escritura hasta que el proceso principal lee la secuencia completa o cierra la secuencia. El interbloqueo se produce cuando el llamador y el proceso secundario se esperan el uno al otro para finalizar una operación y ninguno puede continuar. Los interbloqueos se pueden evitar evaluando las dependencias entre el llamador y el proceso secundario.

En el siguiente ejemplo de código C#, se muestra cómo leer una secuencia redirigida y esperar a que finalice el proceso secundario.

 // 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();

En el ejemplo de código, se evita el interbloqueo llamando a p.StandardOutput.ReadToEnd antes que a p.WaitForExit. Puede producirse una situación de interbloqueo si el proceso primario llama a p.WaitForExit antes que a p.StandardOutput.ReadToEnd y el proceso secundario escribe texto suficiente para rellenar la secuencia redirigida. El proceso primario esperaría indefinidamente a que finalizara el proceso secundario. El proceso secundario esperaría indefinidamente a que el proceso primario lea la secuencia de StandardOutput completa.

Existe un problema similar cuando se lee todo el texto de las secuencias de salida y de error estándar. En el siguiente ejemplo de código C# se realiza una operación de lectura en ambas secuencias.

 // 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();

En el ejemplo de código se evita el interbloqueo realizando operaciones de lectura asincrónica en la secuencia de StandardOutput. Puede producirse una situación de interbloqueo si el proceso primario llama a p.StandardOutput.ReadToEnd y, a continuación a p.StandardError.ReadToEnd, y el proceso secundario escribe texto suficiente para rellenar la secuencia redirigida. El proceso primario esperaría indefinidamente a que el proceso secundario cerrara su secuencia de StandardOutput. El proceso secundario esperaría indefinidamente a que el proceso primario lea la secuencia de StandardError completa.

Se pueden utilizar las operaciones de lectura asincrónica para evitar estas dependencias y la posibilidad de un interbloqueo. Asimismo, se puede evitar una situación de interbloqueo creando dos subprocesos y leyendo el resultado de cada secuencia en subprocesos diferentes.

NotaNota

No se pueden mezclar las operaciones de lectura asincrónica y las de lectura sincrónica en una secuencia redirigida. Cuando se abre la secuencia redirigida de un Process en modo asincrónico o sincrónico, todas las operaciones de lectura adicionales en esa secuencia deben estar en el mismo modo. Por ejemplo, después de BeginOutputReadLine no llame a ReadLine en la secuencia de StandardOutput o viceversa. Sin embargo, se pueden leer dos secuencias diferentes en modos diferentes. Por ejemplo, se puede llamar a BeginOutputReadLine y, a continuación, llamar a ReadLine para la secuencia de StandardError.

En el siguiente ejemplo, se genera un nuevo archivo ejecutable definido por el usuario y se lee su salida estándar. A continuación, la salida se muestra en la consola.

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();

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

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft