0

有没有办法让Process.TotalProcessorTime反映一个进程以及它产生的任何进程?

或者,我如何验证进程(或其后代)是否仍在“积极”运行?


我的应用程序正在生成一个外部进程并等待它退出。使用样本数据需要 5-20分钟才能完成;我没有猜测合理的最大超时时间。所以我的应用程序会每隔一段时间检查另一个进程的Process.TotalProcessorTime值,以确保它不断上升。

这很好用,但我发现该进程只是一个“包装器”,它产生一个子进程,而子进程又会产生一些消耗所有 CPU 时间的其他子进程。

而且我发现TotalProcessorTime在 CPU 利用率达到 100% 的几分钟后只返回一小部分时间。

4

2 回答 2

0

您可以使用性能计数器来检索父进程,如下所示:

PerformanceCounter pc = new PerformanceCounter("Process", 
    "Creating Process Id", " windbg");
Process p = Process.GetProcessById((int)pc.RawValue);

有了这些信息,您就可以监控系统中的进程,维护整个进程树的结构并计算树的 TotalProcessorTime。希望有帮助

于 2009-05-14T23:21:34.817 回答
0

我还没有实现这个,但已经弄清楚它是如何工作的。这很乏味,但并不是那么复杂。

  1. 每隔几秒生成一个后台线程:

    • 构建流程树(有关代码的简化版本,请参见此答案),
    • 如果进程已退出,则终止(监视线程)。
    • 按 PID 维护累积的 CPU 使用率的哈希值,
    • 保持所有进程的所有值的总和,
    • 保持与上次线程触发时总和的差值。
  2. 这应该允许调用代码轻松检查进程(树)是否未挂起(I/O 绑定进程在这里可能有问题,但这不适用于我的情况)。

这一切似乎都不难,除了让监控线程没有(直接)产生的进程的 CPU 使用率可能例外。

如果/当我实现代码时,我会更新这个答案,但这可能需要很长时间。

于 2009-10-13T16:54:27.340 回答