Дождаться окончания процесса

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

Process.Start()

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

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

8 ответов

Решение

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

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

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

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

Я делаю следующее в моем заявлении:

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.

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

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

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done

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

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

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

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

Ссылаясь на пример Microsoft:[https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

Лучше всего установить:

myProcess.EnableRaisingEvents = true;

в противном случае Код будет заблокирован. Также никаких дополнительных свойств не требуется.

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}

Как говорит Джон Скит, используйте 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);
}

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

string command = "...";
var process = Process.Start(command);
process.WaitForExit();
Другие вопросы по тегам