Exportar (0) Imprimir
Expandir todo
Expandir Minimizar
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

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)

[BrowsableAttribute(false)]
public StreamReader StandardOutput { get; }

Valor de propiedad

Tipo: System.IO.StreamReader
Un StreamReader que puede utilizarse para leer el flujo de salida estándar de la aplicación.

ExcepciónCondición
InvalidOperationException

No se ha definido la redirección 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 el flujo 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.


using System;
using System.IO;
using System.Diagnostics;

class IORedirExample
{
    public static void Main()
    {
        string[] args = Environment.GetCommandLineArgs();
        if (args.Length > 1)
        {
            // This is the code for the spawned process
            Console.WriteLine("Hello from the redirected process!");
        }
        else
        {
            // This is the code for the base process
            Process myProcess = new Process();
            // Start a new instance of this program but specify the 'spawned' version.
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(args[0], "spawn");
            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.WaitForExit();
            myProcess.Close();
        }
    }
}


.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

  • LinkDemand 

    para que haya plena confianza para el llamador inmediato. Este miembro no puede ser utilizado por código de confianza parcial.

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft