Дождаться окончания процесса
У меня есть приложение, которое делает
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();