7

我正在编写一段 c# 代码来启动安装程序并等待它返回,然后再继续其他内容。

我在安装某些安装程序时遇到问题,这些安装程序会在安装实际完成之前生成其他进程,原始进程返回。有什么方法可以等到所有流程都完成?

为了澄清这是我遇到问题的场景:

  1. 启动安装程序1
  2. Installer1 产生/启动另一个安装程序 (Installer2)
  3. 安装程序 1 返回
  4. 应用程序认为安装已完成,但 Installer2 仍在运行。这会导致应用程序中的工作流程出现问题。

这是我目前正在使用的代码:

// launch installer
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath);

// wait for process to return
do
{
    if (!process.HasExited)
    {
    }
}
while (!process.WaitForExit(1000));

if (process.ExitCode == 0)
{
    _fileService.MoveFile(_localFilePath, _postInstallFilePath);

    _notification.SetComplete(false);

    return true;
}
return false;
4

2 回答 2

6

您是否考虑过使用 WMI 来解决这个问题?

您可以使用 WMI 来侦听进程创建和删除事件。问题967668有一个很好的例子。

当您收到进程创建事件时,您可以发出 WMI 查询以确定该进程是否是您的根安装程序的子进程(或子进程的子进程等),其内容如下:

“选择 * 从 Win32_Process WHERE ParentProcessId =”。

于 2010-02-10T12:57:54.063 回答
0

do在/while循环中这样做可能会更好:

System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName);

然后遍历procs以找出仍在运行的...通过使用HasExited属性...

逻辑是流程的子流程归您的代码所有,因此您可以先检查它们是否退出,如果没有,继续循环......

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-09T01:50:46.210 回答