我有一个基本的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输出并阻止表单冻结?
由于
答案 0 :(得分:1)
使用后台工作人员执行此操作。在backgroundworder中,您可以向UI报告进度和输出。
上的好例子让工作人员DoWork执行您的代码。在哪里读到你应该做的工作线.ReportProgress。注册该事件并从参数(事件)中获取该行。
答案 1 :(得分:1)
您可以使用Process.BeginOutputReadLine()和BeginErrorReadLine()在程序执行时更新UI。这些方法的MSDN库主题中有一个很好的例子。请注意回调在线程上运行,您必须使用表单的BeginInvoke方法来封送对UI线程的调用并更新控件。使用Process.Exited事件而不是WaitForExit()来检测程序的完成。
这种方法还可以避免在程序写入太多输出以适应控制台输出缓冲区(通常大约2K)时遇到的死锁。