我想获得C#中应用程序的总CPU使用率 . 我已经找到了许多方法来深入研究进程的属性,但我只想要进程的CPU使用率,以及你在TaskManager中获得的总CPU .
我怎么做?
这似乎对我有用,等待处理器达到一定百分比的一个例子
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(); }
您可以使用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"; }
比需求多一点但我使用额外的计时器代码来跟踪并警告CPU使用率是否持续1分钟或更长时间的90%或更高 .
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"; } }
花了一些时间阅读几个看起来相当复杂的不同线程,我想出了这个 . 我需要它用于我想监视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<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获取CPU百分比信息 . 如果您具有正确的权限,甚至可以登录到远程计算机 . 请查看http://www.csharphelp.com/archives2/archive334.html以了解您可以完成的任务 .
也有用的可能是Win32_Process命名空间的MSDN参考 .
另请参见CodeProject示例How To: (Almost) Everything In WMI via C# .
CMS是正确的,但如果您在visual studio中使用服务器资源管理器并使用性能计数器选项卡,那么您可以弄清楚如何获得大量有用的指标 .
我不喜欢在所有的 PerformanceCounter 解决方案中添加1秒钟 . 相反,我选择使用 WMI 解决方案 . 存在1秒等待/失速的原因是为了在使用 PerformanceCounter 时读数准确 . 但是,如果你经常调用这种方法并刷新这些信息,我建议不要经常发生这种延迟......即使考虑做一个异步过程来获得它 .
PerformanceCounter
WMI
我从这里开始使用片段Returning CPU usage in WMI using C#并在我的博客文章中添加了解决方案的完整说明:
Get CPU Usage Across All Cores In C# Using 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; } }
9 回答
这似乎对我有用,等待处理器达到一定百分比的一个例子
您可以使用System.Diagnostics中的PerformanceCounter类 .
像这样初始化:
消费如下:
比需求多一点但我使用额外的计时器代码来跟踪并警告CPU使用率是否持续1分钟或更长时间的90%或更高 .
花了一些时间阅读几个看起来相当复杂的不同线程,我想出了这个 . 我需要它用于我想监视SQL服务器的8核机器 . 对于下面的代码,我传入“sqlservr”作为appName .
它似乎正确地测量了我的8核服务器上SQL使用的CPU百分比 .
没关系,我明白了!谢谢你的帮助!
这是执行此操作的代码:
您可以使用WMI获取CPU百分比信息 . 如果您具有正确的权限,甚至可以登录到远程计算机 . 请查看http://www.csharphelp.com/archives2/archive334.html以了解您可以完成的任务 .
也有用的可能是Win32_Process命名空间的MSDN参考 .
另请参见CodeProject示例How To: (Almost) Everything In WMI via C# .
CMS是正确的,但如果您在visual studio中使用服务器资源管理器并使用性能计数器选项卡,那么您可以弄清楚如何获得大量有用的指标 .
我不喜欢在所有的
PerformanceCounter
解决方案中添加1秒钟 . 相反,我选择使用WMI
解决方案 . 存在1秒等待/失速的原因是为了在使用PerformanceCounter
时读数准确 . 但是,如果你经常调用这种方法并刷新这些信息,我建议不要经常发生这种延迟......即使考虑做一个异步过程来获得它 .我从这里开始使用片段Returning CPU usage in WMI using C#并在我的博客文章中添加了解决方案的完整说明:
Get CPU Usage Across All Cores In C# Using WMI
此类每1秒自动轮询一次计数器并且也是线程安全的: