ProcessStartInfo挂在" WaitForExit"上吗?为什么?

时间:2020-03-06 14:47:05  来源:igfitidea点击:

我有以下代码:

info = new System.Diagnostics.ProcessStartInfo("TheProgram.exe", String.Join(" ", args));
info.CreateNoWindow = true;
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(info);
p.WaitForExit();
Console.WriteLine(p.StandardOutput.ReadToEnd()); //need the StandardOutput contents

我知道我正在启动的进程的输出大约7MB长。在Windows控制台中运行它可以正常工作。不幸的是,它以编程方式无限期地挂在WaitForExit上。还要注意,对于较小的输出(如3KB),此代码不会挂起。

ProcessStartInfo中的内部StandardOutput是否可能无法缓冲7MB?如果是这样,我应该怎么做呢?如果没有,我在做什么错?

解决方案

Process.StandardOutput的文档要求我们在等待之前先阅读,否则可能会死锁,以下代码段已复制:

// 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();

我们也有这个问题(或者一个变体)。

请尝试以下方法:

1)将超时添加到p.WaitForExit(nnnn);其中nnnn以毫秒为单位。

2)将ReadToEnd调用放在WaitForExit调用之前。这就是我们推荐的MS。