c# - 在 C# 中获取当前 CPU 使用率

标签 c#

我想在我的项目中获得当前的 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/

相关文章:

c# - 在 C#.NET 中实现不固定多维数组的最佳方法是什么?

c# - BinaryFormatter - 是否可以在没有程序集的情况下反序列化已知类?

c# - 如何从 Asp .Net 中的 Active Directory 获取不同的部门名称?

c# - FileSystemWatcher.Filter - 在缓冲区之前还是之后?

c# - 如何以编程方式获取 Windows Azure 中的虚拟机列表

c# - 如何在 Excel 电子表格上从 C# 更改工作表名称

c# - 如何分发来自 TCP 监听器的请求

c# - 在 WinForms 应用程序中记录所有按钮点击

c# - NHibernate Criteria 对数据库执行的 SHA1 的限制?

c# - 使用位置记录构造函数和/或 init 属性时如何检查参数是否为空?