Process.GetProcesses() 占用过多的 CPU 利用率

Posted

技术标签:

【中文标题】Process.GetProcesses() 占用过多的 CPU 利用率【英文标题】:Process.GetProcesses() taking too much of CPU utilization 【发布时间】:2021-09-08 05:37:48 【问题描述】:

我在我的 windows 应用程序中使用以下代码,我正在调用此方法来查找另一个进程是否正在运行,问题是,每当我调用此方法时,我的 PC CPU 利用率都会增加 18-25% .还有其他方法可以在 Windows 中找到正在运行的进程吗?提前致谢。

Process[] runningProcessFromCurrentSession = Process.GetProcesses().Where(p => p.SessionId == Process.GetCurrentProcess().SessionId && p.ProcessName.Equals(TrackerAgent.Modal.Constants.Pmdriver)).ToArray();

【问题讨论】:

如果您需要当前流程,您可以使用Process p = Process.GetCurrentProcess(); @AndreyBelykh 我需要另一个进程,而不是当前进程 【参考方案1】:

尝试将此表达式分配给变量:

var currentProcessId = Process.GetCurrentProcess().SessionId;

Process[] runningProcessFromCurrentSession = 
Process.GetProcesses().Where(p => p.SessionId == 
currentProcessIdd &&   p.ProcessName.Equals(TrackerAgent.Modal.Constants.Pmdriver)).ToArray();

【讨论】:

【参考方案2】:

Process.GetCurrentProcess().SessionId 移动到Where 子句之外的变量,否则Process.GetCurrentProcess() 将为GetProcesses 找到的每个进程执行,这会导致CPU 使用率过高:

var sessionId = Process.GetCurrentProcess().SessionId;
Process[] runningProcessFromCurrentSession = Process
    .GetProcesses()
    .Where(p => p.SessionId == sessionId && p.ProcessName.Equals(TrackerAgent.Modal.Constants.Pmdriver))
    .ToArray();

【讨论】:

值得一提的是,我认为这是一个陷阱,使用Linq时很容易掉入其中......它有助于快速 i> 原型设计,但它也有助于快速生成慢代码...:P 每当需要性能时, 自己写一个循环通常会更好......它让人不得不三思而后行,声明变量等......结果通常(如果你有争议地这样做)要好得多。 .. ;)

以上是关于Process.GetProcesses() 占用过多的 CPU 利用率的主要内容,如果未能解决你的问题,请参考以下文章

调用 System.Diagnostics.Process.GetProcesses() 未返回 C# 最小化窗口

性能监控-cpu内存上下行网速线程

性能监控-cpu内存上下行网速线程

01进程

线程线程ID获取

01.多线程之进程类