我需要从C#应用程序运行外部进程,但在继续执行之前等待它返回。同时,我需要从stdout获取并更新包含进度信息的文本框。由于该命令可能会在此期间运行几分钟并打印信息,因此显示该信息是绝对必要的;但多个命令可能会运行,并且必须按顺序,所以等待也是如此。C#在读取异步时等待shell命令返回
我尝试使用:
p = Process.Start();
p.BeginOutputReadLine();
p.WaitForExit();
但冻结UI线程在等待和防止出现输出。这:
p.Start();
p.BeginOutputReadLine();
while (!p.HasExited)
{
Application.DoEvents();
Thread.Sleep(100);
}
工作更好,但是完全错误/一个坏主意,并没有实际等待整个期间。
我也简单地尝试过使用BackgroundWorker来启动shell进程,但我不确定如何让UI线程等待而不会阻止工作者完成。
我想要做的是提供一个DialogResult ShellExecute(String cmd)
类似于ShowDialog()
,如果用户允许该命令完成,单击取消或命令的返回码,则返回OK/Cancel(/ fail)结果。它不应该返回,直到命令完成(或取消)。
所有外壳命令与运行:
ProcessStartInfo info = new ProcessStartInfo
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = "cmd.exe",
Arguments = "/c " + command
};
重定向输出和有效外壳执行该命令。
我该如何正确地创建一个启动异步进程的函数,但仍然等待直到完成返回?
显然,如果你想捕捉标准错误的数据,你必须重复练习与p.ErrorDataReceievd + =的ErrorHandler – 2011-12-21 17:31:53
这并不妨碍该函数创建并返回从启动过程。我的输出成功重定向,我更专注于等待无阻塞。 – ssube 2011-12-21 17:50:24