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

206

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

Process.Start()

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

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

NLV
источник
И если вы хотите сделать это асинхронно (то есть вызвать событие после завершения), вы можете посмотреть здесь на 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.

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

AnthonyLambert
источник
17

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

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done
riffnl
источник
9

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

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

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

Buka
источник
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();
user3065161
источник
5
Какой смысл комментировать ответ на уже отвеченный вопрос о вопросе, на который уже дан ответ? Вы не только потратили впустую свои собственные циклы, но и вынудили меня тратить мои.
Джейми Иванов
@AdamBilinski вопросы и ответы предназначены для просмотра другими людьми, которые задают вопрос не только тому, кто задал вопрос
L3n
4
@ L3n Я согласен, но этот ответ точно такой же, как принятый ответ, так что это бессмысленно!
Адам Билински
@AdamBilinski О, да, ты не прочитал твой комментарий должным образом, прости меня, xD
L3n