重定向输出时ResGen.exe卡住了

时间:2011-03-19 22:47:27

标签: c# process

我尝试重定向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时,它可以正常工作。

我做错了什么?

2 个答案:

答案 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()