所以我有这个代码来启动一个bat脚本,它将执行某些java命令,从“java -version”开始只是为了得到一些输出。我第一次称之为它有效,但第二次我被黑色cmd屏幕困住了。
使用相同的代码但位于不同的位置。
Process proc = new Process();
ProcessStartInfo StartInfo = new ProcessStartInfo();
StartInfo.RedirectStandardOutput = true;
StartInfo.RedirectStandardError = true;
StartInfo.FileName = path + "javaScript.bat";
StartInfo.Arguments = "\"" + path + "\"";
StartInfo.UseShellExecute = false;
StartInfo.CreateNoWindow = false;
proc.StartInfo = StartInfo;
proc.Start();
proc.WaitForExit();
string output = proc.StandardOutput.ReadToEnd();
任何人都可以帮我弄清楚会发生什么?由于我没有得到任何回声,我怀疑bat文件被卡在任何地方(回显打开,第一个命令是java -version所以它应该写一些东西,而不是只是卡在黑色cmd窗口)
答案 0 :(得分:3)
proc.WaitForExit();
string output = proc.StandardOutput.ReadToEnd();
您使用此代码使进程陷入僵局。在清空其输出缓冲区之前,它无法退出。但是在退出之前你不会读取它的输出。该计划无法继续,也不能。一种“致命的拥抱”,更好地称为死锁。
只需交换这两行代码即可解决问题。
请注意,您也遇到StandardError问题,当它向该流发送一堆错误文本时,它仍然会死锁。如果您不想阅读它,请不要重定向它。如果你想让它完全稳固,你需要使用BeginErrorReadLine和BeginOutputReadLine。