2012-04-23 145 views
1

以下是应用程序代码。一段时间p.StandardOutput.ReadLine();工作正常,但过一段时间就挂断我尝试了所有的事情,但仍然收到此错误StandardOutput.ReadLine()应用程序挂起使用C#

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

请帮我

+0

你什么错误? – Arion 2012-04-23 11:24:56

+2

也许程序有时不输出任何东西? – CodesInChaos 2012-04-23 11:26:53

+0

或者它有时输出多于一行?在这种情况下,一旦输出缓冲区满了,被调用的程序就会被阻塞。而且,因为在第一行之后你永远不会读它,它将永远阻塞,因此'WaitForExit()'不会返回。总之,你的程序是错误的,除非被调用的程序总是输出一行,不多不少。 – CodesInChaos 2012-04-23 11:27:55

回答

2

你的程序是正确的,如果被调用的程序总是输出只有一个行,该行是短比系统采用的缓冲区大。

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

如果输出过多,输出缓冲区满运行,并且被调用的程序将阻止其Write电话,直到有人读取输出不够。由于你从不读第一行之外的输出缓冲区,这个块将永远持续下去,因此被调用的程序永远不会终止。这反过来导致您的程序在p.WaitForExit()处于死锁状态。

documentation明确指出:

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

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