.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 `
第一个是通过手动的方法来计算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 `
相关文章推荐
- .NET(C#):获取进程的CPU使用状况
- .NET(C#):获取进程的CPU使用状况
- c# 获取某个进程的CPU使用百分百(类似任务管理器中显示CPU)
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- 使用C#获取CPU及硬盘序列号的源代码
- 获取进程的CPU使用情况
- 详解C#获取特定进程CPU和内存使用率
- 使用.NET FrameWork获取CPU,内存使用率以及磁盘空间
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- 使用属性表达式获取属性名 C# .net
- windows下使用C#获取特定进程网络流量
- java 获取进程ID 物理内存 cpu使用百分比(linux环境)
- 使用.NET FrameWork获取CPU,内存使用率以及磁盘空间
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- C#实现获取硬盘编号、CPU编号及类型、内存大小及使用情况
- C#获取硬盘编号、CPU编号及类型、内存大小及使用情况
- windows下使用C#获取特定进程网络流量
- HTML解析类 ,让你不使用正则也能轻松获取HTML相关元素 -C# .NET
- c#.net使用webBrowser1获取网站信息源码