Вам не нужно использовать 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();
Обратите внимание, что вы не можете использовать API Unity из этой новой темы. Если вы хотите сделать это, используйте UnityThread.executeInUpdate
. См. this для получения дополнительной информации.