/ / Как да използваме процесора в C #? [затворен] - c #, cpu-usage

Как да получите CPU използване в C #? [затворен] - c #, CPU-използване

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

Как да направя това?

Отговори:

171 за отговор № 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";
}

51 за отговор № 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 = 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";
}
}

18 за отговор № 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);
}
}

Изглежда правилно измерване на процента на CPU, използван от SQL на моя 8 сървър.


13 за отговор № 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 +@"rootCIMV2",
"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;
}

9 за отговор № 5

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

Също така полезно може да бъде MSDN справка за Win32_Process пространство от имена.

Вижте също пример за CodeProject Как да: (почти) всичко в WMI чрез C #.


5 за отговор № 6

CMS има право, но и ако използвате сървърния изследовател в визуалното студио и играете с раздела за ефективност, можете да разберете как да получите много полезни показатели.


3 за отговор № 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();
}

2 за отговор № 8

Не ми харесваше да добавям в 1 секунда щанда на всички PerformanceCounter решения. Вместо това избрах да използвам a WMI решение. Причината за съществуването на 1 секунда изчакване / спиране е да се даде възможност на четенето да бъде точна при използване на a PerformanceCounter, Въпреки това, ако наричате този метод често и освежавате тази информация, аз съветвам да не се налага непрекъснато да се налага това забавяне ... дори ако мислите да направите един асинхронен процес, за да го получите.

Започнах с откъса оттук Връщане на използването на CPU в WMI чрез C # и добавих пълно обяснение на решението в моя блог пост по-долу:

Използване на процесора във всички ядра в C #, използвайки WMI


1 за отговор № 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;
}
}