Я хочу получить общее общее использование ЦП для приложения на С#. Я нашел много способов вникать в свойства процессов, но мне нужно только процессорное использование процессов и общий процессор, как вы получаете в TaskManager.
Как это сделать?
Я хочу получить общее общее использование ЦП для приложения на С#. Я нашел много способов вникать в свойства процессов, но мне нужно только процессорное использование процессов и общий процессор, как вы получаете в TaskManager.
Как это сделать?
Вы можете использовать класс 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 = (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";
}
}
Потратив некоторое время на чтение нескольких разных тем, которые казались довольно сложными, я придумал это. Я нуждался в этом для 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 [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;
}
Вы можете использовать WMI для получения информации о процентах процессора. Вы можете даже войти на удаленный компьютер, если у вас есть правильные разрешения. Посмотрите http://www.csharphelp.com/archives2/archive334.html, чтобы получить представление о том, что вы можете выполнить.
Также может быть ссылка MSDN для пространства имен Win32_Process.
См. также пример CodeProject Как: (почти) все в WMI через С#.
CMS имеет это право, но также, если вы используете серверный проводник в visual studio и играете со вкладкой счетчика производительности, вы можете выяснить, как получить множество полезных показателей.
Кажется, это работает для меня, пример ожидания до тех пор, пока процессор не достигнет определенного процента
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 секунду стойло ко всем решениям PerformanceCounter
. Вместо этого я решил использовать решение WMI
. Причина, по которой существует 1 секунда ожидания/стойки, заключается в том, чтобы позволить чтению быть точным при использовании PerformanceCounter
. Однако, если вы часто вызываете этот метод и обновляете эту информацию, я бы посоветовал не постоянно брать на себя эту задержку... даже если подумал о процессе асинхронного процесса, чтобы получить его.
Я начал с фрагмента отсюда Возвращение использования ЦП в WMI с помощью С# и добавил полное объяснение решения в моем сообщении в блоге ниже:
Получить использование ЦП на всех ядрах на С# с использованием WMI
Этот класс автоматически проверяет счетчик каждые 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;
}
}