0

所以我有这段代码来启动一个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 窗口)

4

1 回答 1

3
        proc.WaitForExit();
        string output = proc.StandardOutput.ReadToEnd();

您正在使用此代码使进程陷入僵局。在您清空其输出缓冲区之前,它无法退出。但是在它退出之前你不会读取它的输出。程序不能继续,你也不能。一个“致命的拥抱”,俗称死锁。

只需交换这两行代码即可解决问题。

请注意,您也遇到了 StandardError 问题,当它向该流发送一堆错误文本时,它仍然会死锁。如果您不想阅读它,请不要重定向它。如果你想让它完全稳固,那么你需要使用 BeginErrorReadLine 和 BeginOutputReadLine。

于 2013-08-01T13:46:32.423 回答