C# 检测衍生进程

Posted

技术标签:

【中文标题】C# 检测衍生进程【英文标题】:C# Detecting Spawned Processes 【发布时间】:2011-01-14 15:12:26 【问题描述】:

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

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

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

    启动安装程序1 Installer1 生成/启动另一个安装程序 (Installer2) 安装程序 1 返回 应用程序认为安装已完成,但 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;

【问题讨论】:

您拥有衍生的进程吗?例如。如果这样可以让您更容易检测到完成,您可以修改 Installer2 吗?或者 Installer2 是由其他人提供的,或者您甚至不知道可能会产生哪些额外的进程并且需要处理任意产生的进程? 我们确实拥有相关的特定安装程序。但是,我们也希望能够处理任意生成的进程。 【参考方案1】:

您有没有想过使用 WMI 来解决这个问题?

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

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

"SELECT * FROM Win32_Process WHERE ParentProcessId=".

【讨论】:

对此要非常小心(我发现很难)。 Windows 中的根级进程往往是孤立的(wininit.exe、cs-s-rss.exe),但仍具有父 ID。父进程不再存在,因此其 ID 用于新进程。在查询进程的子进程时,也会返回那些孤立的根级别进程。解决方案,检查子进程的启动时间,确保它们是在父进程之后启动的。【参考方案2】:

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

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

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

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

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

【讨论】:

这为我提供了与我启动的进程 (setup.exe) 同名的进程列表。我对该设置产生的 msiexec.exe 进程感兴趣。跨度>

以上是关于C# 检测衍生进程的主要内容,如果未能解决你的问题,请参考以下文章

如何检测一个进程是不是已经执行完毕

从 Mono 上运行的 C# 进程运行 C++ 应用程序。运行检测器错误

目标检测算法图解:一文看懂RCNN系列算法

如何检测用户是不是在 c# 中摇晃(检测摇晃),

[C#]通用守护进程服务

图像处理 手写体英文字母的目标检测与识别 实验报告