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


206

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

Process.Start()

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

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


И если вы хотите сделать это асинхронно (то есть вызвать событие после завершения), вы можете посмотреть здесь на SO.
Мэтт

Ответы:


401

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

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

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


137

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


определенно хорошая информация с Process.Exited, но ОП сказал «подождите»
Майк М

8
@MikeM: Вот почему я упоминал WaitForExitсначала ... в некоторых случаях вы можете захотеть выполнить больше кода, когда что-то завершится, но это не значит, что вам нужно блокировать текущий поток.
Джон Скит

7
Если вы собираетесь использовать это Process.Exitedсобытие, я считаю, что вам нужно предварительно настроить процесс, установив Process.EnableRaisingEventsзначение true. Хотя, учитывая, что этому вопросу уже более трех лет, возможно, это Process.EnableRaisingEventsне было чем-то особенным во время его задавания.
Уилл

Я попал на эту страницу в поисках названия Process.Exitedмероприятия. Спасибо! +1 за полноту
Чад,

36

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

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.

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


17

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

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

9

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

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

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



1

Ссылаясь на пример 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}");
}

0

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

На самом деле не отвечает на вопрос. Пожалуйста, уточните свой ответ, чтобы решить вопрос
Grantly

И сейчас? может быть, открыть VB и принять решение;)
Дэвид Лопес

-5

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

string command = "...";
var process = Process.Start(command);
process.WaitForExit();

5
Какой смысл комментировать ответ на уже отвеченный вопрос о вопросе, на который уже дан ответ? Вы не только потратили впустую свои собственные циклы, но и вынудили меня тратить мои.
Джейми Иванов

@AdamBilinski вопросы и ответы предназначены для просмотра другими людьми, которые задают вопрос не только тому, кто задал вопрос
L3n

4
@ L3n Я согласен, но этот ответ точно такой же, как принятый ответ, так что это бессмысленно!
Адам Билински

@AdamBilinski О, да, ты не прочитал твой комментарий должным образом, прости меня, xD
L3n
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.