Дождаться окончания процесса - PullRequest
185 голосов
/ 30 июня 2010

У меня есть приложение, которое делает

Process.Start()

для запуска другого приложения «ABC». Я хочу дождаться окончания этого приложения (процесс умирает) и продолжить выполнение. Как я могу это сделать?

Может быть несколько экземпляров приложения 'ABC', запущенных одновременно.

Ответы [ 8 ]

367 голосов
/ 30 июня 2010

Я думаю, вы просто хотите это:

var process = Process.Start(...);
process.WaitForExit();

См. Страницу MSDN для получения информации о методе. Он также имеет перегрузку, в которой вы можете указать время ожидания, поэтому вы не будете ждать вечно.

127 голосов
/ 30 июня 2010

Использовать Process.WaitForExit? Или подписаться на событие Process.Exited, если вы не хотите блокировать? Если это не помогает, пожалуйста, дайте нам больше информации о ваших требованиях.

34 голосов
/ 30 июня 2010

В своем приложении я делаю следующее:

Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.

Здесь есть несколько дополнительных функций, которые могут оказаться полезными ...

16 голосов
/ 30 июня 2010

Вы можете использовать ожидание выхода или перехватить свойство HasExited и обновить свой пользовательский интерфейс, чтобы информировать пользователя (управление ожиданиями):

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done
8 голосов
/ 17 мая 2017

У меня был случай, когда Process.HasExited не изменился после закрытия окна, принадлежащего процессу.Так что Process.WaitForExit() тоже не сработало.Мне пришлось следить за Process.Responding, который после закрытия окна стал ложным:

while (!_process.HasExited && _process.Responding) {
  Thread.Sleep(100);
}
...

Возможно, это кому-то поможет.

6 голосов
/ 30 июня 2010

Process.WaitForExit должен быть именно тем, что вы ищете.

0 голосов
/ 24 ноября 2017

Как говорит Джон Скит, используйте Process.Exited:

proc.StartInfo.FileName = exportPath + @"\" + fileExe;
proc.Exited += new EventHandler(myProcess_Exited);
proc.Start();
inProcess = true;

while (inProcess)
{
    proc.Refresh();
    System.Threading.Thread.Sleep(10);
    if (proc.HasExited)
    {
        inProcess = false;
    }
}

private void myProcess_Exited(object sender, System.EventArgs e)
{
    inProcess = false;
    Console.WriteLine("Exit time:    {0}\r\n" +
      "Exit code:    {1}\r\n", proc.ExitTime, proc.ExitCode);
}
0 голосов
/ 17 января 2014

Попробуйте это:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...