等待进程结束

我有一个应用程序

Process.Start()

启动另一个应用程序'ABC'。我想要等到应用程序结束(进程死亡)并继续执行。我该怎么做呢?

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

292708 次浏览

使用Process.WaitForExit吗?或者订阅Process.Exited事件如果你不想阻塞?如果这不能满足你的要求,请给我们更多的信息。

我认为你只想要这个:

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

该方法参见MSDN页面。它还有一个重载,您可以指定超时,因此您可能不会永远等待。

的过程。WaitForExit应该是你正在寻找的我认为。

你可以使用wait for exit或者你可以捕获HasExited属性并更新你的UI来让用户“被告知”(期望管理):

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

我在我的申请中做了以下几点:

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.

有一些额外的功能,你可能会发现有用的…

试试这个:

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

我有一个案例,在关闭属于进程的窗口后,Process.HasExited没有改变。所以Process.WaitForExit()也没有工作。我必须监视Process.Responding在关闭窗口后变为false:

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

也许这对某些人有帮助。

就像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);
}

参考微软的例子: [https://learn.microsoft.com/en us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework - 4.8) < / p >

最好的设置是:

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}");
}