您的位置:首页 > 编程语言 > C#

.NET(C#):获取进程的CPU使用状况

2014-04-08 15:23 302 查看

第一个是通过手动的方法来计算CPU使用比例:CPU使用比例 = 在间隔时间内进程的CPU使用时间 除以 计算机逻辑CPU数量

使用Process类的UserProcessorTime和PrivilegedProcessorTime属性可以返回当前进程所耗费CPU的用户和内核时间。Process.TotalProcessorTime则代表两者之和。它们都返回TimeSpan结构体对象。

代码:

//+ using System.Diagnostics

//+ using System.Threading

staticvoid UsingProcess(string pname)

{

using (var pro=Process.GetProcessesByName(pname)[0])

{

//间隔时间(毫秒)

int interval=1000;

//上次记录的CPU时间

var prevCpuTime=TimeSpan.Zero;

while (true)

{

//当前时间

var curTime= pro.TotalProcessorTime;

//间隔时间内的CPU运行时间除以逻辑CPU数量

var value= (curTime-
prevCpuTime).TotalMilliseconds/ interval/Environment.ProcessorCount*100;

prevCpuTime = curTime;

//输出

Console.WriteLine(value);

Thread.Sleep(interval);

}

}

}

注意:

经测试上述方法同下面方法一样结果都比较准确,而且上面的方法更快(考虑到下面性能计数器的使用,尤其是多个重复进程名称在性能计数器中的处理),而上面方法可以直接用进程ID(PID)查询,因为用的是Process类,这是性能计数器不能快速做到的。

但是,上面的方法仅有一个缺点,当监控某些系统进程时可能会抛出Win32Exception异常指示“访问被拒绝”(即便是你已经使用管理员账户来运行程序)。

第二个是用性能计数器(PerformanceCounter)来监控,这个有现成的性能计数器专门做这个工作,可以直接参考控制面板中性能监控里的Process类的% Processor Time性能计数器。

唯一需要注意的地方是:改性能计数器的返回值没有考虑到多核(多个)CPU的情况,所以计算结果应该除以CPU数量!

代码:

staticvoid UsingPerfmon(string pname)

{

//创建性能计数器

using (var p1=newPerformanceCounter("Process","%
Processor Time", pname))

{

while (true)

{

//注意除以CPU数量

Console.WriteLine(p1.NextValue()/Environment.ProcessorCount);

Thread.Sleep(1000);

}

}

}

直接调用方法(需要指定一个进程名称)就可以每个一段时间输出改进程的CPU使用百分比:

比如看看Windows任务管理器的CPU使用率:

//或者UsingPerfmon("taskmgr");

UsingProcess("taskmgr");

作者:Mgen

出处:www.cnblogs.com/mgen `


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐