StandardOutput.ReadLine()使用c#挂起应用程序

以下是应用程序代码。 一段时间p.StandardOutput.ReadLine(); 工作正常,但有一段时间它挂断了我尝试了所有的东西,但仍然得到这个错误

ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe"); String s = " "; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.CreateNoWindow = true; startInfo.RedirectStandardInput = true; startInfo.RedirectStandardOutput = true; startInfo.UseShellExecute = false; Process p = Process.Start(startInfo); p.StandardInput.WriteLine("list volume\n"); String f = ""; bool ignoredHeader = false; s = p.StandardOutput.ReadLine(); p.WaitForExit(); 

请帮我

如果被调用程序总是输出一行,并且该行短于系统使用的缓冲区,则程序是正确的。

如果它没有输出一行, ReadLine将不会返回。 所以你的程序在这种情况下被打破了。

如果输出太多,则输出缓冲区将满,并且被调用的程序将阻止其Write调用,直到有人从输出中读取足够的内容。 由于您从未在第一行之外的输出缓冲区中读取,因此该块将永远持续,因此被调用的程序将永远不会终止。 这反过来导致程序在p.WaitForExit()处死锁。

文件明确指出:

在读取到重定向流的末尾之前,不要等待子进程退出。

代码示例通过在p.StandardOutput.ReadToEnd之前调用p.StandardOutput.ReadToEnd避免死锁条件。 如果父进程在p.WaitForExit之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能导致死锁条件。 父进程将无限期地等待子进程退出。 子进程将无限期地等待父进程从完整的StandardOutput流中读取。