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::StandardError (Propiedad)

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

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

[BrowsableAttribute(false)]
public:
property StreamReader^ StandardError {
	StreamReader^ get ();
}

Valor de propiedad

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

ExcepciónCondición
InvalidOperationException

No se ha definido la redirección de la secuencia de StandardError; asegúrese de que el valor de ProcessStartInfo::RedirectStandardError esté establecido en true y que el valor de ProcessStartInfo::UseShellExecute esté establecido en false.

– O bien –

Se ha abierto la secuencia de StandardError para operaciones de lectura asincrónica con BeginErrorReadLine.

Cuando un Process escribe texto en la secuencia de error estándar, dicho texto se muestra normalmente en la consola. Si se redirige la secuencia de StandardError, se puede manipular o suprimir la salida de errores 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 StandardError, es preciso establecer el valor de ProcessStartInfo::UseShellExecute en false y el valor de ProcessStartInfo::RedirectStandardError en true. De lo contrario, al leer la secuencia de StandardError, se produce una excepción.

La secuencia de StandardError 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 de error del proceso. Estas operaciones de lectura sincrónica no terminan hasta que el Process asociado escribe en la secuencia de StandardError o cierra la secuencia.

Por contraste, BeginErrorReadLine inicia las operaciones de lectura asincrónica en la secuencia de StandardError. 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 StandardError 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 error stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardError = 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 error stream.
 // p.WaitForExit();
 // Read the error stream first and then wait.
 string error = p.StandardError.ReadToEnd();
 p.WaitForExit();

En el ejemplo de código, se evita el interbloqueo llamando a p.StandardError.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.StandardError.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 StandardError 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 BeginErrorReadLine no llame a ReadLine en la secuencia de StandardError 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 utiliza el comando net use junto con un argumento suministrado por el usuario para asignar un recurso de red. A continuación, se lee la secuencia de error estándar del comando de red y se escribe en la consola.


Process^ myProcess = gcnew Process;
ProcessStartInfo^ myProcessStartInfo = gcnew ProcessStartInfo( "net ",String::Concat( "use ", args[ 0 ] ) );

myProcessStartInfo->UseShellExecute = false;
myProcessStartInfo->RedirectStandardError = true;
myProcess->StartInfo = myProcessStartInfo;
myProcess->Start();

StreamReader^ myStreamReader = myProcess->StandardError;
// Read the standard error of net.exe and write it on to console.
Console::WriteLine( myStreamReader->ReadLine() );
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