C# ReadLine()使用c挂起应用程序#
下面是应用程序代码。有时p.StandardOutput.ReadLine();工作正常,但有一段时间它挂了我尝试了所有的东西,但仍然得到这个错误C# ReadLine()使用c挂起应用程序#,c#,asp.net,C#,Asp.net,下面是应用程序代码。有时p.StandardOutput.ReadLine();工作正常,但有一段时间它挂了我尝试了所有的东西,但仍然得到这个错误 ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe"); String s = " "; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.CreateNo
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.WaitForExit
之前调用p.StandardOutput.ReadToEnd
来避免死锁情况。如果父进程在p.StandardOutput.ReadToEnd
之前调用p.WaitForExit
,并且子进程写入足够的文本以填充重定向流,则可能导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的StandardOutput
流中读取
也许程序有时不输出任何东西?或者有时输出多行?在这种情况下,一旦输出缓冲区已满,被调用的程序将阻塞。而且,由于您从未在第一行之后读取它,它将永远阻塞,因此
WaitForExit()
不会返回。简而言之,您的程序是错误的,除非被调用的程序总是只输出一行,不多也不少。或者有时程序写入标准错误而不是标准输出?例如,当它检测到某个地方出了问题时?@Arion它只是挂起application@CodeInChaos不,它没有任何输出