当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中获得CPU使用率?

如何解决《如何在C#中获得CPU使用率?》经验,为你挑选了6个好方法。

我想获得C#中应用程序的总CPU使用率.我已经找到了许多方法来深入研究进程的属性,但我只想要进程的CPU使用率,以及你在TaskManager中获得的总CPU.

我怎么做?



1> CMS..:

您可以使用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";
} 


很好 - 但原始来源似乎来自这里:http://zamov.online.fr/EXHTML/CSharp/CSharp_927308.html
从我发现我必须使用cpuCounter.NextValue()两次,他们之间我不得不睡觉(500)
你需要调用.NextValue两次,中间调用System.Threading.Thread.Sleep(1000ms就足够了).有关为什么需要这样做的更多信息,请参见http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx,但高级摘要是您需要两个样本才能计算值,你需要给操作系统一个时间来获得这两个.
是的,它看起来像是该链接的副本,所以原始的参考链接将是不错的风格.另一方面,它也很好的CMS提供答案在这里,所以懒惰的开发人员不必搜索遍布谷歌找到相同的答案.:O)

2> Khalid Raham..:

多一点是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";
    }
}


getRAMCounter()在哪里?

3> 小智..:

花了一些时间阅读几个看起来相当复杂的不同线程,我想出了这个.我需要它用于我想监视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百分比.


您在哪里将`done`设置为true?除非我忽略了某些内容,否则这似乎是一个无休止的循环:`while(!done){...}`

4> xoxo..:

没关系,我明白了!谢谢你的帮助!

这是执行此操作的代码:

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



5> 小智..:

您可以使用WMI获取CPU百分比信息.如果您具有正确的权限,甚至可以登录到远程计算机.请访问http://www.csharphelp.com/archives2/archive334.html,了解您可以完成的任务.

另外有用的可能是Win32_Process命名空间的MSDN参考.

另请参阅CodeProject示例如何:(几乎)通过C#在WMI中的所有内容.



6> Tarks..:

CMS是正确的,但如果您在visual studio中使用服务器资源管理器并使用性能计数器选项卡,那么您可以弄清楚如何获得大量有用的指标.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有