2009-12-10 11 views
0

我有一個基本的Winform,調用外部程序(SVN)。我想在窗體的文本框中顯示SVN產生的輸出。刷新窗體控件與外部程序輸出

這裏是我的調用這個外部的程序代碼:

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

這就是所謂的一個「的foreach」裏。問題是,當我啓動命令時,我必須等到每一個命令都完成了......這可能需要很長時間。在此期間,表單凍結,並且文本框中不顯示任何內容。
也許使用這種方法,儘管有WaitForExit,同時啓動這些命令?我不確定,我不熟悉這類問題(我更像是一名Web開發人員)。

如何在程序運行時顯示SVN輸出並阻止表單凍結?

謝謝

回答

1

使用backgroundworker來做到這一點。在backgroundworder中,您可以向UI報告進度和輸出。

MSDN

很好的例子讓你的工人做的DoWork代碼。你在哪裏讀到行,你應該做worker.ReportProgress。註冊該事件並從參數(事件)中獲取該行。

+0

謝謝,但我該怎麼做? – thomasb 2009-12-10 12:11:12

1

您可以使用Process.BeginOutputReadLine()和BeginErrorReadLine()在程序執行時更新UI。在這些方法的MSDN庫主題中有一個很好的例子。注意回調在線程上運行,您必須使用表單的BeginInvoke方法來調用UI線程並更新控件。使用Process.Exited事件而不是WaitForExit()來檢測程序的完成。

這種方法還可以避免當程序編寫太多輸出以適應控制檯輸出緩衝區時(通常在2K左右)時出現死鎖。