使用 PerformanceCounter 获取进程的 CPU 使用率

Posted

技术标签:

【中文标题】使用 PerformanceCounter 获取进程的 CPU 使用率【英文标题】:Get CPU usage of process with PerformanceCounter 【发布时间】:2014-01-18 16:05:18 【问题描述】:

我正在尝试获取特定进程的 CPU 使用率,但它只返回 0。我仍然不知道问题是什么。

Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)

    if (GetProcessOwner(theprocess.Id) != "NO_OWNER")
    
        if (theprocess.ProcessName != "svchost")
        
            var ram = BytesToString(theprocess.PeakWorkingSet64);
            ram = ram.Replace("MB", "");

            string state = "";

            if (theprocess.MainWindowTitle == "") 
            
                state = "background";
            
            else 
            
                state = "foreground";
            

            sw.WriteLine("ID=" + theprocess.Id + "&NAME=" + theprocess.ProcessName + "&RAM=" + ram + "&STARTED=" + theprocess.StartTime + "&STATE=" + state);
            PerformanceCounter counter = new PerformanceCounter("Process", "% Processor Time", theprocess.ProcessName);
            Console.WriteLine("CPU="+counter.NextValue());
        
    

【问题讨论】:

只是想知道您是否为p.ProcessName 创建了一个对象。我试图复制并粘贴它,但它没有被定义。 @puretppc 编辑了我的问题。 第一次调用 NextValue() 初始化计数器。然后你之后重复调用它,相隔一秒,然后你在最后一秒得到使用。必须等待那一秒很重要,您可以使用计时器。 可能重复Why the cpu performance counter kept reporting 0% cpu usage? 【参考方案1】:

没关系,因为NextValue第一次调用时总是返回0

要修复此错误,您可以在创建 PerformanceCounter 对象后调用 NextValue 函数两次(durty hack)。

【讨论】:

>如果计数器的计算值取决于两次计数器读取,则第一次读取操作返回 0.0。重置性能计数器属性以指定不同的计数器相当于创建一个新的性能计数器,并且使用新属性的第一次读取操作返回 0.0。调用 NextValue 方法之间的建议延迟时间为一秒,以允许计数器执行下一次增量读取。 msdn.microsoft.com/en-us/library/… 那么不可能1分钟内得到所有进程的CPU百分比? 可以将收集信息分为两个阶段:第一个循环用于创建 PerformanceCounter 对象和第一次调用 NextValue 函数,第二次用于第二次调用 NextValue。 Thread.sleep 必须划分两个阶段 ^你能在你的答案中添加这个澄清吗?

以上是关于使用 PerformanceCounter 获取进程的 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

如何修复异步 WMI 选择/PerformanceCounter 上的 UI 死锁以获取远程计算机 LastBootUpTime

需要使用 CounterDelta32 PerformanceCounter 的示例

如何以编程方式记录 PerformanceCounter

通过powershell能否获取CPU每个核心的使用率

使用 PerformanceCounter 跟踪每个进程的内存和 CPU 使用情况?

为啥调用 PerformanceCounter 很慢?