在C#程序,我试图获取应用程序的CPU使用率,但它总是显示100(In a C# Program,

2019-06-26 05:55发布

这里是我的代码。

        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";

        // will always start at 0
        dynamic firstValue = cpuCounter.NextValue();
        System.Threading.Thread.Sleep(1000);


        dynamic secondValue = cpuCounter.NextValue();
        return secondValue;

有很多人在这里,所得到的问题,这将返回零,但是我我在任何时候都得到100,我肯定知道我的软件是不是占用了那么多CPU powrer。 任何想法,我能做些什么,以正确的,使这项工作。 需要明确的是,我正在尝试从运行此代码不是一个单独的一个应用程序的处理器使用率。 另外,我在虚拟机上运行,​​但是这似乎并不重要。 有任何想法吗?

Answer 1:

它有助于了解CPU的工作原理弄清楚为什么发生这种情况。 我将简化它有点与只有一个核心谈论CPU,故事并没有一个多核改变。

CPU核可以是仅在两个不同的状态,当它未处于睡眠模式。 它要么是执行代码,在全通径为快,因为它可以去执行指令运行。 或者是因为没有什么需要做它没有执行代码。 在这种情况下,它在物理上断开。 这时候执行HLT指令发生。 停止,什么也不做,不消耗功率。

仅存在一个恢复由暂停状态的处理器方式,需要一个中断。 这是芯片上的物理引脚,该引脚上的电压颠簸活着回来。 这个电压是由中断控制器,另一芯片需要从机器的各个部分请求得到CPU做一些有用的东西产生。

该中断的最重要的来源是一个时钟。 它在蜱0.0156秒,颠簸CPU背面每秒活着64次。 激活在操作系统中,基本上检查两件事情的一段代码。 “出什么事了,当我睡着了吗?”。 而“我还没睡着了可言,时间做别的,是非常重要的太”。 或者换句话说,它不只是摇晃CPU活着,它也中断它在它在做什么。 因此,该信号的名称。

时钟不中断的唯一来源,你得连接到CPU硬件的其他位。 I / O设备。 任何机具有重要的是磁盘控制器,光盘驱动器控制器中,网络卡,鼠标和键盘。 和其他任何你在设备管理器小程序见。 他们子系统结合,可充分的东西照顾自己的小处理器。 并告诉他们这样做的主要CPU。 所以,无论你的机器上线程正在等待结果可以恢复与提供的数据执行。

绝大多数的时候,你已经得到了个人电脑坐在你旁边没有做任何事情重要。 它是说,等你来读这个答案。 通过东西的视频适配器和液晶显示器的照顾,在CPU没有帮助。 你可以看到它的TaskMgr.exe,CPU利用率徘徊在0您移动鼠标,点击滚动条阅读(长)的答案,然后有事。 鼠标产生一个中断,即得到通过软件若干层传递,并且最终告诉浏览器滚动视图。 这大约需要几毫秒的时间,给予或采取。

工作几毫秒后,CPU就后退睡着。 所以,当你问的CPU,与性能计数器,“多少工作最近你怎么做”,它会说:“好,我花了几毫秒的烧录核心和工作我的屁股更新您的屏幕,但没有其他。比我正在睡觉的豌豆”

所以,重要的是你要多久。 样板方式是性能监视器使用的一个。 一旦第二个是问“你做了什么”。 并且处理器会说:“好了,在最后一秒,我执行的有用功20毫秒我死了,世界上剩下的时间里,没有任何有用的。” 所以,任务管理器显示2%。

现在,让我们做你的方式。 你问的性能计数器的值,然后纳秒以后你再询问用户。 该处理器会说:“好,我返回性能计数器的值,并试图回去睡觉没有工作,程序不停地奔跑代码,问我同样的事情!”。

所以结果是准确的,该处理器与您的请求占用,你不给它一个机会断电。 CPU利用率为100%。

解决方法:做喜欢做的Perfmon。 具有定时问一次作为第二。 它缩短和数量上升和下降速度更快。 让它太短,这将是100%



Answer 2:

这里是什么,做类似于你可能会试图做

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;

cpuCounter = new PerformanceCounter();

cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";

ramCounter = new PerformanceCounter("Memory", "Available MBytes");


public string getCurrentCpuUsage(){
            return cpuCounter.NextValue()+"%";
}

public string getAvailableRAM(){
            return ramCounter.NextValue()+"MB";
} 


文章来源: In a C# Program, I am trying to get the CPU usage percentage of the application but it always shows 100