C#检测产生的进程

时间:2010-02-09 01:36:00

标签: c# installer process spawn

我正在编写一段c#代码,用于启动安装程序并在继续使用其他内容之前等待它返回。

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

为了澄清这里我遇到问题的情况:

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

    // 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;
    

2 个答案:

答案 0 :(得分:6)

您是否考虑过使用WMI解决此问题?

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

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

“SELECT * FROM Win32_Process WHERE ParentProcessId =”。

答案 1 :(得分:0)

do / while循环内执行此操作可能会更好:

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

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

逻辑是进程的子进程由您的代码拥有,因此您可以先检查它们是否已退出,如果没有,则继续循环...

希望这有帮助, 最好的祝福, 汤姆。