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 利用率的主要内容,如果未能解决你的问题,请参考以下文章