Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取C中的当前CPU利用率#_C# - Fatal编程技术网

C# 获取C中的当前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

我希望在我的项目中有当前的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
,但当我在
上执行
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(或线程),因为有限制。可能已经有答案了。