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 volumen"); 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
流中读取。上述就是C#学习教程:StandardOutput.ReadLine()使用c#挂起应用程序分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1017088.html