我想在我的项目中拥有当前的CPU利用率
namespace Monitoring_Tool
{
public partial class ajaxExecute : System.Web.UI.Page
{
private PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
private PerformanceCounter theMemCounter = new PerformanceCounter("Memory", "Available MBytes");
protected void Page_Load(object sender, EventArgs e)
{
float cpuUsage = 0.00F;
cpuUsage = this.theCPUCounter.NextValue();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我调试我的项目时,值cpuUsage显示0.00但是当我这样做QuickWatch时this.theCPUCounter.NextValue();它正在显示20.6786852.
为什么我不能将它存储在变量中?
Chr*_*n.K 10
那是因为你需要NextValue在同一个PerformanceCounter实例上多次调用(所以至少两次).第一个调用将始终返回0.
你可以通过NextValue在Page_Load事件处理程序中调用两次来解决这个问题,只存储第二个调用的返回值:
float cpuUsage = 0.00F;
this.theCPUCounter.NextValue();
cpuUsage = this.theCPUCounter.NextValue();
Run Code Online (Sandbox Code Playgroud)
它在调试器的QuickWatch中显示的原因可能只是因为它(隐式)被多次调用(一次由程序调用,一次由调试器调用QuickWatch值).
更新到上面的"那种":
正如其他人所提到的,你通常需要在两次调用之间休息一段时间才能真正观察到CPU负载的差异,从而产生"可测量的"差异.睡眠1秒通常可以解决问题,但在加载页面时可能不会是一个可接受的延迟.
你真正想做的是提供一个后台线程,重复查询这个性能计数器,在两者之间休息几秒钟.并将结果存储在某处.从您Page_Load或其他事件/函数查询(最后)值.当然,所有这些都必须锁定数据竞争.对于这个指针,它将尽可能精确.
由于您显然使用的是ASP.NET,因此必须小心使用这些后台线程.我不是ASP.NET专家,但根据这一点,它应该是可能的,即使你的应用程序域/ Web应用程序是回收的线程(和它所做的perf计数器读数).但是,对于这种不应成为问题的功能.
Han*_*ant 10
它是一个性能计数器,在很大程度上取决于您何时阅读它.处理器内核要么执行代码,要么以"100%"运行全孔.或者它完全关闭,由HALT指令停止."%Processor Time"计数器告诉您自上次检查以来有多少%的时间,它一直在执行代码.
因此,如果您在采样之间等待足够长的时间,您将只获得有意义的值.一秒钟是样板文件,这是你在Perfmon.exe和Taskmgr.exe中看到的.间隔越短,数字越不准确.它开始变化很大,在0到100%之间跳跃.
因此,在页面的Load事件中获得0%是正常的,它只是初始化计数器以设置间隔的开始.获取下一个示例很困难,您无法在事件处理程序中实际执行此操作.你必须做一些激烈的事情,比如让一个单独的计时器或线程以一秒的间隔采样并使用该值.