从StandardError和StandardOutput读取挂起

时间:2014-07-12 19:53:32

标签: c# cmd unity3d

我从这里使用了灵魂: 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天了,仍然无法使其正常工作。 请帮忙!

1 个答案:

答案 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