我尝试重定向ResGen.exe的标准输出。我使用以下代码
ProcessStartInfo psi = new ProcessStartInfo( "resxGen.exe" );
psi.CreateNoWindow = true;
psi.Arguments = sb.ToString();
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
Process p = Process.Start( psi );
p.WaitForExit();
StreamReader sr = p.StandardOutput;
string message = p.StandardOutput.ReadToEnd();
它停留在p.WaitForExit上。当我关闭输出流重定向并且不读取StandardOutput时,它可以正常工作。
我做错了什么?
答案 0 :(得分:5)
在读取流后,您需要等待进程结束,否则代码中会出现死锁。 问题是你的父进程阻塞等待子进程完成,子进程正在等待父进程读取输出,因此你有一个死锁。
Here是对问题的详细描述。
像这样更改代码可以避免死锁:
StreamReader sr = p.StandardOutput;
string message = p.StandardOutput.ReadToEnd();
p.WaitForExit();
答案 1 :(得分:1)
底线似乎是p.WaitForExit
的展示位置不正确;只有在从流中读取您想要的内容后才能进行此方法调用。
来自MSDN:
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
另请注意,您StreamReader sr = p.StandardOutput
的使用在此处是多余的,因为设置message
的值后您使用p.StandardOutput.ReadToEnd();
访问流 - 请注意 p.StandardOutput
,而不是 sr.ReadToEnd()
。