Exportar (0) Imprimir
Expandir todo

ProcessStartInfo.RedirectStandardOutput (Propiedad)

Obtiene o establece un valor que indica si el resultado de una aplicación se escribe en la secuencia de Process.StandardOutput.

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

public bool RedirectStandardOutput { get; set; }
/** @property */
public boolean get_RedirectStandardOutput ()

/** @property */
public void set_RedirectStandardOutput (boolean value)

public function get RedirectStandardOutput () : boolean

public function set RedirectStandardOutput (value : boolean)

Valor de propiedad

Es true para escribir los resultados en Process.StandardOutput; de lo contrario, es false.

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

Es preciso establecer el valor de UseShellExecute en false si se desea establecer el valor de 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 primario. El proceso secundario espera la siguiente operación de escritura hasta que el proceso primario 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.

Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();    

Console.WriteLine(compiler.StandardOutput.ReadToEnd());

compiler.WaitForExit();

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