Waitforexit统一中断我正在运行的应用程序

时间:2018-04-28 19:25:25

标签: c# unity3d process background

我正在尝试以统一运行exe应用程序来执行某些功能,并且exe文件将在我的麦克风输入时以单位运行,所以我必须等到它退出,而使用waitforexit很好,允许exe输入但这并不好,因为我在运行期间的统一应用程序会停止,直到我的exe完成,我想在我的exe运行时执行其他的统一。

这是我的代码: -

System.Diagnostics.Process p = new System.Diagnostics.Process();

    p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
    p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.Start();
    p.WaitForExit();

2 个答案:

答案 0 :(得分:2)

您不必使用WaitForExit,因为它阻止了主线程。您的问题有两种解决方法:

1 。将EnableRaisingEvents设置为true。订阅Exited事件并使用它来确定打开的程序何时关闭。使用布尔标志来确定它是否仍然在Update函数中打开。

bool processing = false;

void Start()
{
    processing = true;

    Process p = new Process(); ;
    p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
    p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
    p.StartInfo.CreateNoWindow = true;
    p.EnableRaisingEvents = true;
    p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.Exited += new EventHandler(OnProcessExit);
    p.Start();
}

private void OnProcessExit(object sender, EventArgs e)
{
    processing = false;
}


void Update()
{
    if (processing)
    {
        //Still processing. Keep reading....
    }
}

2 。继续使用WaitForExit 仅在新Thread中使用该代码,以便它不会阻止或冻结Unity的主线程。

//Create Thread
Thread thread = new Thread(delegate ()
{
    //Execute in a new Thread
    Process p = new Process(); ;
    p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
    p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.Start();
    p.WaitForExit();

    //....
});
//Start the Thread and execute the code inside it
thread.Start();

请注意,您无法使用此新线程中的Unity API。如果您想这样做,请使用UnityThread.executeInUpdate。有关详细信息,请参阅this

答案 1 :(得分:0)

谢谢大家,但我发现最终解决方案在这里运作良好。 它会节省你的时间

https://www.youtube.com/watch?v=C5VhaxQWcpE

在应用解决方案之后,这是我的代码: -

这是我在上面的视频中应用解决方案后的代码

public async void run_speechToText()

{
    Task task = new Task(StartListening);
    task.Start();
    Debug.Log("My exe file is running right now");
    await task;
    get_answer();
}

public void StartListening()
{
    p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
    p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    p.Start();
    p.WaitForExit();

}