Подтвердить что ты не робот

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

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

Как это сделать?

4b9b3361

Ответ 1

Вы можете использовать класс 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";
} 

Ответ 2

Чуть больше, чем требовалось, но я использую дополнительный код таймера для отслеживания и оповещения, если загрузка ЦП составляет 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 = (int)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";
    }
}

Ответ 3

Потратив некоторое время на чтение нескольких разных тем, которые казались довольно сложными, я придумал это. Я нуждался в этом для 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-ядерном сервере.

Ответ 4

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

Вот код для этого:

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 [email protected]"\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;
}

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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();
}

Ответ 8

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

Я начал с фрагмента отсюда Возвращение использования ЦП в WMI с помощью С# и добавил полное объяснение решения в моем сообщении в блоге ниже:

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

Ответ 9

Этот класс автоматически проверяет счетчик каждые 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;
    }
}