이 설명서는 보관되지만 유지 되지 않습니다.

ProcessStartInfo.RedirectStandardError 속성

업데이트: 2007년 11월

응용 프로그램의 오류 출력을 Process.StandardError 스트림에 쓸 것인지 여부를 나타내는 값을 가져오거나 설정합니다.

네임스페이스:  System.Diagnostics
어셈블리:  System(System.dll)

public bool RedirectStandardError { get; set; }
/** @property */
public boolean get_RedirectStandardError()
/** @property */
public  void set_RedirectStandardError(boolean value)

public function get RedirectStandardError () : boolean
public function set RedirectStandardError (value : boolean)

속성 값

형식: System.Boolean

Process.StandardError에 오류 출력을 쓰려면 true이고, 그렇지 않으면 false입니다.

Process에서 표준 오류 스트림에 텍스트를 쓰면 해당 텍스트는 일반적으로 콘솔에 표시됩니다. StandardError 스트림을 리디렉션하여 프로세스의 오류 출력을 조작하거나 표시하지 않을 수 있습니다. 예를 들어 텍스트를 필터링하거나, 텍스트의 형식을 변경하거나, 출력을 콘솔과 지정된 로그 파일에 모두 쓸 수 있습니다.

참고:

RedirectStandardErrortrue로 설정하려면 UseShellExecutefalse로 설정해야 합니다. 그렇지 않으면 StandardError 스트림에서 읽어올 때 예외가 throw됩니다.

리디렉션된 StandardError 스트림은 동기적 또는 비동기적으로 읽을 수 있습니다. Read, ReadLineReadToEnd와 같은 메서드는 프로세스의 오류 출력 스트림에 대해 동기 읽기 작업을 수행합니다. 이들 동기 읽기 작업은 연결된 ProcessStandardError 스트림에 쓰거나 해당 스트림을 닫기 전까지는 완료되지 않습니다.

반면 BeginErrorReadLineStandardError 스트림에 대해 비동기 읽기 작업을 시작합니다. 이 메서드는 지정된 이벤트 처리기가 스트림 출력에 사용되도록 한 다음 즉시 호출자에게 되돌아갑니다. 호출자는 스트림 출력이 이벤트 처리기로 전달되는 동안 다른 작업을 수행할 수 있습니다.

동기 읽기 작업은 StandardError 스트림에서 읽어오는 호출자와 해당 스트림에 쓰는 자식 프로세스 간의 종속성을 유발합니다. 이러한 종속성으로 인해 교착 상태가 발생할 수 있습니다. 호출자에서 자식 프로세스의 리디렉션된 스트림을 읽어올 때 호출자는 자식 프로세스에게 종속됩니다. 자식 프로세스가 스트림에 쓰거나 스트림을 닫을 때까지 호출자는 읽기 작업을 대기합니다. 자식 프로세스가 리디렉션된 스트림을 채우기에 충분한 데이터를 쓸 때 자식 프로세스는 부모 프로세스에 종속됩니다. 부모 프로세스가 전체 스트림을 읽거나 스트림을 닫을 때까지 자식 프로세스는 다음 쓰기 작업을 대기해야 합니다. 호출자와 자식 프로세스가 서로 상대 프로세스의 작업이 완료되기를 기다리면서 아무 작업도 처리할 수 없는 경우 교착 상태가 발생합니다. 호출자와 자식 프로세스 간의 종속성을 확인하여 교착 상태를 방지할 수 있습니다.

예를 들어 다음 C# 코드에서는 리디렉션된 스트림을 읽고 자식 프로세스가 종료되기를 기다리는 방법을 보여 줍니다.

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

이 코드 예제에서는 p.WaitForExit 이전에 p.StandardError.ReadToEnd를 호출하여 교착 상태를 방지합니다. 부모 프로세스에서 p.WaitForExitp.StandardError.ReadToEnd 이전에 호출하고 자식 프로세스에서 리디렉션된 스트림을 채우기에 충분한 텍스트를 쓰는 경우 교착 상태가 발생할 수 있습니다. 부모 프로세스는 자식 프로세스가 종료될 때까지 무기한 대기합니다. 자식 프로세스는 부모 프로세스가 전체 StandardError 스트림에서 읽을 때까지 무기한 대기합니다.

표준 출력 스트림과 표준 오류 스트림 모두에서 전체 텍스트를 읽는 경우에도 비슷한 문제가 발생할 수 있습니다. 예를 들어 다음 C# 코드에서는 두 스트림 모두에 대해 읽기 작업을 수행합니다.

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

이 코드 예제에서는 StandardOutput 스트림에 대해 비동기 읽기 작업을 수행하여 교착 상태를 방지합니다. 부모 프로세스에서 p.StandardOutput.ReadToEnd를 호출한 다음 p.StandardError.ReadToEnd를 호출하고, 자식 프로세스에서 오류 스트림을 채우기에 충분한 텍스트를 쓰는 경우 교착 상태가 발생합니다. 부모 프로세스는 자식 프로세스가 StandardOutput 스트림을 닫을 때까지 무기한 대기합니다. 자식 프로세스는 부모 프로세스가 전체 StandardError 스트림에서 읽을 때까지 무기한 대기합니다.

비동기 읽기 작업을 사용하여 이러한 종속성으로 인한 교착 상태를 방지할 수 있습니다. 또는 두 개의 스레드를 만든 다음 각 스트림의 출력을 개별 스레드에서 읽는 방법을 통해 교착 상태를 방지할 수 있습니다.

다음 예제에서는 net use 명령을 사용자가 제공한 인수와 함께 사용하여 네트워크 리소스를 매핑합니다. 그런 다음 net 명령의 표준 오류 스트림을 읽어와서 콘솔에 씁니다.

Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("net ","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();


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0, 1.1, 1.0에서 지원
표시: