Получить текущее использование ЦП в С#

Я хочу, чтобы текущее использование ЦП в моем проекте

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 на this.theCPUCounter.NextValue();, он показывает 20.6786852.

Почему я не могу хранить его в переменной?

Ответ 1

Это потому, что вам нужно называть NextValue несколько раз на одном и том же экземпляре PerformanceCounter (по крайней мере, дважды). Первый вызов всегда будет возвращать 0.

Вы можете обойти это (сорт), дважды позвонив NextValue в свой обработчик событий Page_Load, сохраняя только возвращаемое значение второго вызова:

        float cpuUsage = 0.00F;

        this.theCPUCounter.NextValue();
        cpuUsage = this.theCPUCounter.NextValue();

Причина, которую он показывает в QuickWatch отладчика, вероятно, просто потому, что она (неявно) называется несколько раз (один раз программой и один раз отладчиком для значения QuickWatch).

Обновите "вид" выше:

Как уже упоминалось, вам обычно нужно поспать некоторое время между двумя вызовами, чтобы фактически наблюдать разницу в загрузке процессора, что приводит к "измеримой" разнице. Спать в течение 1 с обычно делает трюк, но может не быть приемлемой задержкой при загрузке вашей страницы.

То, что вы действительно хотите сделать, это предоставить фоновый поток, который неоднократно запрашивает этот счетчик производительности, спящий через пару секунд. И где-то сохраняем результат. Из вашего Page_Load или других событий/функций запросите (последнее) значение. Разумеется, все с необходимой блокировкой против данных. Это будет так же точно, как вы можете получить относительно этого указателя.

Поскольку вы, очевидно, используете ASP.NET, вы должны быть осторожны с такими фоновыми потоками. Я не эксперт ASP.NET, но в соответствии с этим это должно быть возможно, даже если поток (и показания счетчика перформанса) будет переработан, когда ваш домен приложения/веб-приложение. Однако для такого рода функций это не должно быть проблемой.

Ответ 2

Это счетчик производительности, который сильно зависит от того, когда вы его читаете. Ядро процессора либо выполняет код, работая с полным отверстием на уровне "100%". Или он полностью выключен, остановлен инструкцией HALT. Счетчик "% Processor Time" сообщает вам, сколько процентов времени, так как в последний раз, когда вы его проверяли, он выполнял код.

Таким образом, вы получите только значимые значения, если вы достаточно долго будете ждать от него. Одна секунда является шаблоном, что вы видите в Perfmon.exe и Taskmgr.exe. Чем короче интервал, тем менее точным становится число. Он начинает сильно меняться, прыгая между 0 и 100%.

Таким образом, получение 0% на странице. Событие загрузки является нормальным, оно просто инициализирует счетчик, чтобы установить начало интервала. Получение следующего образца - это трудность, вы не можете реалистично сделать это в обработчике событий. Вам нужно было бы сделать что-то решительное, например, иметь отдельный таймер или поток, который сэмплирует с интервалом в одну секунду и использует это значение.