我想获得C#中应用程序的总CPU使用率.我已经找到了许多方法来深入研究进程的属性,但我只想要进程的CPU使用率,以及你在TaskManager中获得的总CPU.
我怎么做?
您可以使用System.Diagnostics中的PerformanceCounter类.
像这样初始化:
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"; }
多一点是requsted,但我使用额外的计时码追踪和警报,如果CPU使用率是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"; } }
花了一些时间阅读几个看起来相当复杂的不同线程,我想出了这个.我需要它用于我想监视SQL服务器的8核机器.对于下面的代码,我传入"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); } }
它似乎正确地测量了我的8核服务器上SQL使用的CPU百分比.
没关系,我明白了!谢谢你的帮助!
这是执行此操作的代码:
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().First(); return Convert.ToInt32(queryObj["PercentIdleTime"]); } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); } return -1; }
您可以使用WMI获取CPU百分比信息.如果您具有正确的权限,甚至可以登录到远程计算机.请访问http://www.csharphelp.com/archives2/archive334.html,了解您可以完成的任务.
另外有用的可能是Win32_Process命名空间的MSDN参考.
另请参阅CodeProject示例如何:(几乎)通过C#在WMI中的所有内容.
CMS是正确的,但如果您在visual studio中使用服务器资源管理器并使用性能计数器选项卡,那么您可以弄清楚如何获得大量有用的指标.