Как получить использование процессора в C#?

Я хочу получить общее общее использование процессора для приложения в C#. Я нашел много способов покопаться в свойствах процессов, но мне нужно только использование процессора процессами, а также общий процессор, который вы получаете в TaskManager.

Как я могу это сделать?

11 ответов

Вы можете использовать класс PerformanceCounter из System.Diagnostics.

Инициализировать так:

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;

cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
ramCounter = new PerformanceCounter("Memory", "Available MBytes");

Потреблять так:

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

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

Немного больше, чем требовалось, но я использую дополнительный код таймера для отслеживания и оповещения, если загрузка ЦП составляет 90% или выше в течение продолжительного периода времени 1 минута или дольше.

public class Form1
{

    int totalHits = 0;

    public object getCPUCounter()
    {

        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);
                    // now matches task manager reading
        dynamic secondValue = cpuCounter.NextValue();

        return secondValue;

    }


    private void Timer1_Tick(Object sender, EventArgs e)
    {
        int cpuPercent = getCPUCounter();
        if (cpuPercent >= 90)
        {
            totalHits = totalHits + 1;
            if (totalHits == 60)
            {
                Interaction.MsgBox("ALERT 90% usage for 1 minute");
                totalHits = 0;
            }                        
        }
        else
        {
            totalHits = 0;
        }
        Label1.Text = cpuPercent + " % CPU";
        Label2.Text = getRAMCounter() + " RAM Free";
        Label3.Text = totalHits + " seconds over 20% usage";
    }
}

Потратив некоторое время на чтение нескольких разных тем, которые казались довольно сложными, я придумал это. Я нуждался в этом для 8-ядерного компьютера, где я хотел контролировать сервер SQL. Для кода ниже я перешел в "sqlservr" как appName.

private static void RunTest(string appName)
{
    bool done = false;
    PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total");
    PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", appName);
    while (!done)
    {
        float t = total_cpu.NextValue();
        float p = process_cpu.NextValue();
        Console.WriteLine(String.Format("_Total = {0}  App = {1} {2}%\n", t, p, p / t * 100));
        System.Threading.Thread.Sleep(1000);
    }
}

Кажется, он правильно измеряет процент использования ЦП SQL на моем 8-ядерном сервере.

Все нормально, я понял! Спасибо за вашу помощь!

Вот код, чтобы сделать это:

private void button1_Click(object sender, EventArgs e)
{
    selectedServer = "JS000943";
    listBox1.Items.Add(GetProcessorIdleTime(selectedServer).ToString());
}

private static int GetProcessorIdleTime(string selectedServer)
{
    try
    {
        var searcher = new
           ManagementObjectSearcher
             (@"\\"+ selectedServer +@"\root\CIMV2",
              "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\"");

        ManagementObjectCollection collection = searcher.Get();
        ManagementObject queryObj = collection.Cast<ManagementObject>().First();

        return Convert.ToInt32(queryObj["PercentIdleTime"]);
    }
    catch (ManagementException e)
    {
        MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
    }
    return -1;
}

Вы можете использовать WMI для получения процентной информации о процессоре. Вы даже можете войти в удаленный компьютер, если у вас есть правильные разрешения. Посмотрите на http://www.csharphelp.com/archives2/archive334.html чтобы получить представление о том, что вы можете сделать.

Также полезным может быть ссылка на MSDN для пространства имен Win32_Process.

См. Также пример CodeProject. Как: (почти) все в WMI через C#.

В CMS это правильно, но если вы используете обозреватель серверов в Visual Studio и играете с вкладкой счетчика производительности, то вы можете выяснить, как получить множество полезных показателей.

Для тех, кто все еще не может получить общий показатель использования ЦП, который соответствует диспетчеру задач, вы должны использовать это утверждение:

      new PerformanceCounter("Processor Information", "% Processor Utility", "_Total");

Мне кажется, это работает, пример ожидания, пока процессор не достигнет определенного процента

var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
int usage = (int) cpuCounter.NextValue();
while (usage == 0 || usage > 80)
{
     Thread.Sleep(250);
     usage = (int)cpuCounter.NextValue();
}

Этот класс автоматически опрашивает счетчик каждые 1 секунду, а также является потокобезопасным:

public class ProcessorUsage
{
    const float sampleFrequencyMillis = 1000;

    protected object syncLock = new object();
    protected PerformanceCounter counter;
    protected float lastSample;
    protected DateTime lastSampleTime;

    /// <summary>
    /// 
    /// </summary>
    public ProcessorUsage()
    {
        this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    public float GetCurrentValue()
    {
        if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
        {
            lock (syncLock)
            {
                if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
                {
                    lastSample = counter.NextValue();
                    lastSampleTime = DateTime.UtcNow;
                }
            }
        }

        return lastSample;
    }
}

Мне не нравилось добавлять в 1-й стойле все PerformanceCounter решения. Вместо этого я решил использовать WMI решение. Причина, по которой существует 1 секунда ожидания / остановки, заключается в том, что при использовании PerformanceCounter, Тем не менее, если вы будете часто вызывать этот метод и обновлять эту информацию, я бы посоветовал не постоянно подвергаться этой задержке... даже если подумал о выполнении асинхронного процесса для его получения.

Я начал с фрагмента здесь. Возвращение загрузки процессора в WMI с использованием C# и добавил полное объяснение решения в своем блоге ниже:

Получить использование ЦП во всех ядрах в C# с помощью WMI

public int GetCpuUsage()
{
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", Environment.MachineName);
cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000); //This avoid that answer always 0
return (int)cpuCounter.NextValue();
}

Исходная информация по этой ссылке https://gavindraper.com/2011/03/01/retrieving-accurate-cpu-usage-in-c/

Другие вопросы по тегам