1

以下是应用程序代码。一段时间 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();

请帮我

4

1 回答 1

2

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

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

如果它输出太多,输出缓冲区就会满,被调用的程序会阻塞它的Write调用,直到有人从输出中读取足够的内容。由于您从未从第一行之后的输出缓冲区中读取数据,因此该块将永远存在,因此被调用的程序将永远不会终止。这反过来会导致您的程序在p.WaitForExit().

文件明确指出:

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

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

于 2012-04-23T11:33:52.543 回答