2010-06-30 2 views
149

Я приложение, которое делаетПодождите, пока процесс не закончится

Process.Start() 

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

Возможно одновременное использование нескольких экземпляров приложения «ABC».

ответ

306

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

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

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

113

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

+26

+1 к этому событию. – NLV

+1

сделать это +1 ++ :) – Apelsin

+0

определенно хорошая информация с Process.Exited, но OP действительно сказал «wait» –

14

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

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

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

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. 

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

+1

нет «он также хорошо работает ...» – AnthonyLambert

-5

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

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

Какой смысл комментировать ответ на уже ответ на вопрос, на который уже ответили? Мало того, что вы потратили впустую свои собственные циклы, но вы заставили меня тоже тратить впустую. –

+0

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

+4

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

4

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

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

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

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); 
} 
+0

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

+0

И теперь? возможно, открыть vb и сделать решение;) –

Смежные вопросы