2009-12-10 2 views
0

외부 프로그램 (SVN)을 호출하는 기본 winform이 있습니다. 양식의 텍스트 상자에 SVN에 의해 ​​생성 된 출력을 표시하고 싶습니다. 그것은이 "foreach는"내부라고외부 프로그램 출력을 사용한 양식 컨트롤 새로 고침

private void SVNcmd(string args, string workingcopy) 
{ 
    textBoxOutput.Text += workingcopy + Environment.NewLine 
     + args + Environment.NewLine; 
    Process p = new Process(); 
    p.StartInfo.WorkingDirectory = workingcopy; 
    p.StartInfo.FileName = "svn"; 
    p.StartInfo.Arguments = args; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.Start(); 
    textBoxOutput.Text += p.StandardOutput.ReadToEnd() + Environment.NewLine; 
    p.WaitForExit(); 
} 

:

다음은이 외부 프로그램을 호출하는 내 코드입니다. 문제는 명령을 실행할 때 각 명령이 완료 될 때까지 기다려야한다는 것입니다 ... 그리고 꽤 오래 걸릴 수 있습니다. 이 시간 동안 양식이 정지되고 텍스트 상자에 아무 것도 표시되지 않습니다.
아마도이 방법을 사용하면 WaitForExit에도 불구하고 명령이 동시에 실행됩니다. 잘 모르겠다. 나는 이런 유형의 문제에 익숙하지 않다. (나는 웹 개발자에 가깝다.)

SVN 출력을 표시하고 프로그램이 실행되는 동안 양식이 정지되지 않도록하려면 어떻게해야합니까?

감사합니다.

답변

1

배경 작업자를 사용하십시오. backgroundworder에서 진행 상황과 출력을 UI에보고 할 수 있습니다. MSDN

좋은 예는 작업자 DoWork이 코드를하자. 선을 읽은 곳에서 worker.ReportProgress를 실행해야합니다. 해당 이벤트에 등록하고 param (이벤트)에서 라인을 가져옵니다.

+0

감사합니다. 어떻게해야합니까? – thomasb

1

프로그램을 실행하는 동안 Process.BeginOutputReadLine() 및 BeginErrorReadLine()을 사용하여 UI를 계속 업데이트 할 수 있습니다. 이러한 메서드에 대한 MSDN 라이브러리 항목의 좋은 예가 있습니다. 콜백이 스레드에서 실행된다는 점에주의하십시오. 폼의 BeginInvoke 메서드를 사용하여 UI 스레드에 대한 호출을 마샬링하고 컨트롤을 업데이트해야합니다. WaitForExit() 대신 Process.Exited 이벤트를 사용하여 프로그램 완료를 검색합니다.

이 접근법은 프로그램이 콘솔 출력 버퍼 (보통 2K 정도)에 맞게 너무 많은 출력을 쓸 때 발생하는 교착 상태를 방지합니다.

관련 문제