使用外部程序输出刷新表单控件

时间:2009-12-10 11:57:00

标签: .net winforms

我有一个基本的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?我不确定,我不熟悉这类问题(我更像是一名网络开发人员)。

如何在程序运行时显示SVN输出并阻止表单冻结?

由于

2 个答案:

答案 0 :(得分:1)

使用后台工作人员执行此操作。在backgroundworder中,您可以向UI报告进度和输出。

MSDN

上的好例子

让工作人员DoWork执行您的代码。在哪里读到你应该做的工作线.ReportProgress。注册该事件并从参数(事件)中获取该行。

答案 1 :(得分:1)

您可以使用Process.BeginOutputReadLine()和BeginErrorReadLine()在程序执行时更新UI。这些方法的MSDN库主题中有一个很好的例子。请注意回调在线程上运行,您必须使用表单的BeginInvoke方法来封送对UI线程的调用并更新控件。使用Process.Exited事件而不是WaitForExit()来检测程序的完成。

这种方法还可以避免在程序写入太多输出以适应控制台输出缓冲区(通常大约2K)时遇到的死锁。