C# 获取C中的当前CPU利用率#
我希望在我的项目中有当前的CPU利用率C# 获取C中的当前CPU利用率#,c#,C#,我希望在我的项目中有当前的CPU利用率 namespace Monitoring_Tool { public partial class ajaxExecute : System.Web.UI.Page { private PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); private Perf
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
,但当我在上执行QuickWatch
时,这个.thepucounter.NextValue()代码>正在显示20.6786852
为什么我不能将其存储在变量中?这是因为您需要在同一个PerformanceCounter
实例上多次调用NextValue
(至少两次)。第一次调用将始终返回0
您可以通过在Page\u Load
事件处理程序中调用NextValue
两次来解决这一问题,只存储第二次调用的返回值:
float cpuUsage = 0.00F;
this.theCPUCounter.NextValue();
cpuUsage = this.theCPUCounter.NextValue();
它显示在调试器的QuickWatch中的原因可能只是因为它(隐式)被多次调用(一次由程序调用,一次由调试器调用QuickWatch值)
更新到上面的“排序”:
正如其他人所提到的,您通常需要在两次调用之间睡眠一段时间,以实际观察CPU负载的差异,从而产生“可测量”的差异。睡眠1秒通常可以做到这一点,但在加载页面时,这可能不是一个可接受的延迟
您真正想要做的是提供一个后台线程,该线程重复查询此性能计数器,并在其间休眠几秒钟。并将结果存储在某个地方。从页面\u Load
或其他事件/函数查询(最后一个)值。当然,所有这些都带有针对数据竞争的必要锁定。
关于这个指针,它将尽可能精确
由于您显然在使用ASP.NET,因此必须小心使用此类后台线程。我不是ASP.NET专家,但根据我的说法,这应该是可能的,即使当你的应用程序域/web应用程序运行时,线程(及其性能计数器读数)将被回收。但是,对于这种功能,这不应该是一个问题。它是一个性能计数器,在很大程度上取决于您何时阅读它。处理器核心要么执行代码,以“100%”的速度全速运行。或者完全关闭,由HALT指令停止。“%Processor Time”(处理器时间)计数器告诉您自上次检查它以来,它已执行代码的时间百分比
因此,只有在采样之间等待足够长的时间,才能获得有意义的值。一秒钟是样板,这是您在Perfmon.exe和Taskmgr.exe中看到的。间隔越短,数字越不准确。它开始剧烈变化,在0%到100%之间跳跃
因此,在页面的加载事件中获得0%是正常的,它只是初始化计数器以设置间隔的开始。获取下一个示例非常困难,您无法在事件处理程序中实际执行此操作。您必须做一些激烈的事情,例如使用一个单独的计时器或线程,以1秒的间隔采样并使用该值。愚蠢的评论,但可能您在调试时还没有跳过指令,因此新值尚未存储在cpuUsage
变量中?“第一次调用将始终返回0。”有什么原因吗?@sab669 Per the:“如果计数器的计算值取决于两次计数器读取,则第一次读取操作返回0.0”。“%Processor Time”计数器需要状态才能为您提供答案,而对它们的第一次调用没有可比较的状态,因此它们让状态返回0。更多信息。我必须计算Windows服务中的CPU使用情况,在获得CPU读数后,我应该以JSON格式将其发送到服务器。对于CPU当前的使用情况,我不能使用单独的线程。在C#中是否没有简单的函数可以获得当前的CPU使用率,就像我们在Android中使用的那样?除了使用WMI之外,您可能还需要p/invoke和从此开始。考虑一个新的问题-确保你声明你不能使用PC(或线程),因为有限制。可能已经有答案了。