我从这里使用了灵魂:
ProcessStartInfo hanging on "WaitForExit"? Why?
创建运行流程并获得StandardOutput和StandardError。
问题是,这仍然是悬而未决!
我相信这可能是因为我正在使用cmd。
我的代码中的“noJava”实际上是.class文件的文件路径,它打印出一个命令并将其发送到统一服务器。
如果我在cmd中手动拨打电话java -cp E:/Java/src/ Lift
,我首先收到1行代码:Command: objects["Door"].transform.position.x += ((new Vector3(0.0,1.0,0.0))).x*0.6;objects["Door"].transform.position.y += ((new Vector3(0.0,1.0,0.0))).y*0.6;objects["Door"].transform.position.z += ((new Vector3(0.0,1.0,0.0))).z*0.6;
然后,如果我将窗口切换为统一,我会收到剩下的信息(我相信服务器只接受连接,而unity是活动窗口)。
现在,如果我尝试这样做,它会挂起:
using (run_process = new Process())
{
run_process.StartInfo.FileName = "cmd";
run_process.StartInfo.Arguments = " /C java -cp "+noJava;
//run_process.StartInfo.CreateNoWindow = true;
run_process.StartInfo.UseShellExecute = false;
run_process.StartInfo.RedirectStandardOutput = true;
run_process.StartInfo.RedirectStandardError = true;
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
{
run_process.OutputDataReceived += (sender, e) => {
if (e.Data == null)
{
outputWaitHandle.Set();
}
else
{
output.AppendLine(e.Data);
}
};
run_process.ErrorDataReceived += (sender, e) =>
{
if (e.Data == null)
{
errorWaitHandle.Set();
}
else
{
error.AppendLine(e.Data);
}
};
run_process.Start();
run_process.BeginOutputReadLine();
run_process.BeginErrorReadLine();
if (run_process.WaitForExit(3000) &&
outputWaitHandle.WaitOne(3000) &&
errorWaitHandle.WaitOne(3000))
{
// Process completed. Check process.ExitCode here.
}
else
{
// Timed out.
}
}
}
我已经尝试解决这个问题2天了,仍然无法使其正常工作。 请帮忙!
答案 0 :(得分:0)
对于遇到同样问题的其他人:如果最终找到解决方案。
问题是,当进入播放模式时,统一启动adb.exe,这会中断服务器正常关闭。链接到错误: http://forum.unity3d.com/threads/bug-unity-runs-adb-exe-when-entering-play-mode-in-the-editor.148176/
写完一个小的" adb.exe"过程杀手,一切都开始好起来了! :d