2013-07-10 5 views
6

C#에서는 완료하는 데 2 ​​~ 3 시간이 걸리는 타사 응용 프로그램을 시작합니다. 실시간으로 콘솔에 쓸 프로세스의 출력이 필요합니다. Microsoft의 웹 사이트에서 BeginOutputReadLine()RedirectStandardOutput에 대한 연구를 수행했지만 코드가 여전히 작동하지 않습니다.C# 프로세스의 출력을 실시간으로 표시합니다.

현재 내 코드는 프로세스가 완료 될 때만 출력을 표시합니다. 나는 그것이 어디 잘못되었는지 모른다.

static void Main(string[] args) 
{ 
    Process process; 
    process = new Process(); 
    process.StartInfo.FileName = "C:\\ffmbc\\ffmbc.exe"; 
    process.StartInfo.Arguments = "-i \\\\dssp-isi-t\\TMD\\B002C010_130520_R2R7.2398v5.mxf -an -vcodec libx264 -level 4.1 -preset veryslow -tune film -x264opts bluray-compat=1:weightp=0:bframes=3:nal-hrd=vbr:vbv-maxrate=40000:vbv-bufsize=30000:keyint=24:b-pyramid=strict:slices=4:aud=1:colorprim=bt709:transfer=bt709:colormatrix=bt709:sar=1/1:ref=4 -b 30M -bt 30M -threads 0 -pass 1 -y \\\\dss-isi-t\\MTPO_Transfer\\dbay\\B002C010_130520_R2R7.2398v5.mxf.h264"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); 
    process.StartInfo.RedirectStandardInput = true; 
    process.Start(); 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 
    process.Close(); 
} 

private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    string line; 
    line = (outLine.Data.ToString()); 
    Console.WriteLine(line); 
} 
+0

@Xeano 정확히 같은 질문은 아니지만 예, 꽤 유사합니다. – feralin

+1

이것은 꽤 정상적입니다. 프로세스의 출력을 리디렉션하면 버퍼링 된 출력으로 전환됩니다. 그것이 많은 텍스트를 침을 뱉어 내지 않으면 그 버퍼는 플러시되도록 충분히 채워지지 않습니다. 프로그램 코드를 수정할 수 없다면 아무 것도 할 수 없습니다. –

답변

6

라인

process.WaitForExit(); 

는 주어진 프로세스가 완료 될 때까지 기다릴 현재 프로그램의 원인이됩니다. 이것은 당신이 원하는 것이 아닙니다. 프로세스를 시작하고 비동기 적으로 실행하게 한 다음 프로세스가 완료되면 알려주는 것이 좋습니다. 이를 위해서는 process.Exited 이벤트를 사용하는 것이 좋습니다.

+0

process.WaitForExit()을 제거하면; 콘솔이 백그라운드에서 프로세스를 실행 한 다음 닫으면 여전히 실시간 출력이 표시되지 않습니다. 'OutputHandler'메서드에서 문자열을 허용 했습니까? – user2475310

2

나는 이전의 질문과 비슷하게 답변했습니다. 참조 : Pipe a stream to Debug.Write()

여기에 그에서 (약간 수정) 내 대답입니다 :

process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.OutputDataReceived += p_OutputDataReceived; 
process.Start(); 
process.BeginOutputReadLine(); 

그런 다음, 데이터를 수신하여 이벤트 핸들러. 즉 프로세스가 완료 될 때까지 프로그램이 정지하게하기 때문에

void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.Write(e.Data); 
} 

기본적으로, 당신은 단지의 WaitForExit()를 닉스해야합니다.

+1

이전 질문은 무엇입니까? 링크를 제공하십시오. 그리고 이것이 그 대답의 역류 일 뿐인 경우, 당신의 대답은 대답이 아닌 주석이어야합니다. –

+0

조언을 주셔서 감사합니다 @ JimMischel, 나는 내 대답에 링크를 추가합니다. 미안 내 대답이 적절하지 않은 경우, 나는 종종 답변을 표시 할시기와 대답시기에 대해 혼동스러워합니다. – Gray

관련 문제