等到过程结束


206

我有一个应用程序

Process.Start()

启动另一个应用程序“ ABC”。我要等到该应用程序结束(进程终止)并继续执行。我该怎么做?

应用程序“ ABC”可能同时运行多个实例。


如果要异步执行(即在完成后引发事件),则可以在此处查看。
马特

Answers:


401

我想您只想要这样:

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

有关方法,请参见MSDN页面。它还有一个过载,您可以在其中指定超时,因此您不必永远等待。


137

使用Process.WaitForExit?还是Process.Exited如果不想阻止就订阅该活动?如果这样做不能满足您的要求,请给我们提供有关您的要求的更多信息。


Process.Exited绝对是不错的信息,但操作员确实说了“等待”
Mike M

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属性并更新UI以使用户保持“知情”状态(期望管理):

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

9

我遇到了一种情况,Process.HasExited在关闭属于该进程的窗口后,它没有改变。所以Process.WaitForExit()也没有用。我必须监视Process.Responding关闭窗口后变为false的错误:

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

也许这对某人有帮助。



1

请参考Microsoft的示例:[ https://docs.microsoft.com/zh-CN/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

就像Jon Skeet所说的那样,请使用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);
}

并没有真正回答这个问题。请完善您的答案以解决问题
格兰特

现在?也许打开vb并提出解决方案;)
David Lopes

-5

试试这个:

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

5
关于已经回答的问题,对已经回答的问题的答案发表评论有什么意义?您不仅浪费了自己的自行车,而且还迫使我也浪费了我的时间。
Jamie Ivanov

@AdamBilinski问题和答案旨在让有问题的其他人看到,不仅是提问的人
L3n

4
@ L3n我同意,但是此答案与已接受的答案完全相同,因此毫无意义!
亚当·比林斯基

@AdamBilinski哦,是的,您没有正确阅读您的评论,请原谅我xD
L3n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.