WMI查询多实例进程的CPU占用率问题

IE11下面经常卡到爆 2011-12-02 11:55:46
需求:利用Windows Service查询本地机器上指定名称的进程CPU占用率(可能有多个同名进程运行),以下以notepad为例

使用pm=new PerformanceCounter("Process", "% Processor Time", "notepad")当只有一个进程运行时一切正常(用pm.NextValue得到CPU占用率)
当有多个notepad进程时,用的Dictionary<PID, pm>保存的计数器,经多次实验,发现它们内部使用的仍是一个计数器
当其中一个使用时,要么得到的所有notepad进程的占用率都是零,要么都是实际使用的那个进程的占用率,得到的值相互影响

已尝试new PerformanceCounter("Process", "% Processor Time", "notepad#i") i为1,2,3发现与上面得到的结果一样

怎样得到像任务管理器那样每个进程的CPU占用率呢?

查了一些资料,使用
var searcher = new ManagementObjectSearcher("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfFormattedData_PerfProc_Process");
查询两次进行比较可以计算得到,但不知为何在我机器上(Win7 64位)Timestamp_Sys100NS 总是空

求达人帮忙?
...全文
279 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄亮 2011-12-02
  • 打赏
  • 举报
回复
我用chrome#1尝试是有区别的,不加#n是总的占有率,#n后刷新其他页面cpu占有率零,刷新该页面cpu占有率马上提升。n应该是从0开始
  • 打赏
  • 举报
回复
由于是定时监控,所以每次new pm是不划算的,弄了个字典来保存计数器。但有的进程可能已经退出,所以仍然需要更新计数器的实例编号
PerformanceCounter pm = null;
foreach (var proGroup in processes.GroupBy(p => p.ProcessName))
{
for (int i = 0; i < proGroup.Count(); i++)
{
var process = proGroup.ElementAt(i);
try
{
string instanceName = process.ProcessName + (i == 0 ? "" : ("#" + i.ToString()));
if (this.processMonitor.ContainsKey(process.Id))
{
pm = this.processMonitor[process.Id];
pm.InstanceName = instanceName; //重要
}
else
{
pm = new PerformanceCounter("Process", "% Processor Time", instanceName);
this.processMonitor.Add(process.Id, pm);
pm.NextValue();
}
...
}
}

  • 打赏
  • 举报
回复
多谢你的尝试,昨晚搞到好晚,晕头转向,今天回过头又重新测试了一下
用string proName = process.ProcessName + (i==0 ? "" : ("#" + i.ToString()));
pm = new PerformanceCounter("Process", "% Processor Time", proName);
得到了正确的数据
我昨晚用这种好像也测试过的,现在竟然可以了

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧