我想在我的项目中获得当前的 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();
}
}
}
当我调试我的项目时,cpuUsage
中的值显示为 0.00
,但是当我在 this.theCPUCounter 上执行
它显示 QuickWatch
时。 NextValue();20.6786852
。
为什么我不能将它存储在变量中?
最佳答案
那是因为您需要在同一 PerformanceCounter
实例上多次调用 NextValue
(因此至少两次)。第一次调用将始终返回 0。
您可以通过在您的 Page_Load
事件处理程序中调用两次 NextValue
来解决这个(某种)问题,只存储第二次调用的返回值:
float cpuUsage = 0.00F;
this.theCPUCounter.NextValue();
cpuUsage = this.theCPUCounter.NextValue();
它显示在调试器的 QuickWatch 中的原因可能只是因为它被(隐式)调用了多次(一次被程序调用,一次被调试器调用以获得 QuickWatch 值)。
更新上面的“某种”:
正如其他人所提到的,您通常需要在两次调用之间休眠一段时间,以实际观察导致“可测量”差异的 CPU 负载差异。休眠 1 秒通常可以解决问题,但在加载页面时可能不是可接受的延迟。
您真正想要做的是提供一个重复查询此性能计数器的后台线程,并在其间休眠几秒钟。并将结果存储在某处。从您的 Page_Load
或其他事件/函数查询(最后)值。当然,所有这些都需要针对数据竞争进行锁定。
关于此指针,它将尽可能准确。
由于您显然使用的是 ASP.NET,因此您必须小心处理此类后台线程。我不是 ASP.NET 专家,但根据 this它应该是可能的,即使线程(和它所做的性能计数器读数)将被回收,当你的应用程序域/网络应用程序是。但是,对于这种功能,这应该不是问题。
关于c# - 在 C# 中获取当前 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18398786/