C# 与任务管理器相比,CPU使用率百分比不准确

C# 与任务管理器相比,CPU使用率百分比不准确,c#,.net,winforms,C#,.net,Winforms,我试图得到与任务管理器相同的CPU使用率结果,单位为%。 对于内存,我使用了此代码,它似乎工作正常: ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql); ManagementObjectCollection res

我试图得到与任务管理器相同的CPU使用率结果,单位为%。 对于内存,我使用了此代码,它似乎工作正常:

        ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
        ManagementObjectCollection results = searcher.Get();

        foreach (ManagementObject result in results)
        {
            double TotalVisibleMemorySize = (Convert.ToDouble(result["TotalVisibleMemorySize"])) / (1024 * 1024);
            Console.WriteLine("Total Visible Memory: {0} GB", (TotalVisibleMemorySize).ToString("0.0"));

            double FreePhysicalMemory = (Convert.ToDouble(result["FreePhysicalMemory"])) / (1024 * 1024);
            Console.WriteLine("Free Physical Memory: {0} GB", (FreePhysicalMemory).ToString("0.0"));

            double FreePhysicalMemoryPercent = (FreePhysicalMemory * 100) / TotalVisibleMemorySize;
            Console.WriteLine("Free Physical Memory: {0} %", (FreePhysicalMemoryPercent).ToString("0.0"));

            double UsedPhysicalMemory = TotalVisibleMemorySize - FreePhysicalMemory;
            Console.WriteLine("Used Physical Memory: {0} GB", (UsedPhysicalMemory).ToString("0.0"));

            double UsedPhysicalMemorypercent = 100 - FreePhysicalMemoryPercent;
            Console.WriteLine("Used Physical Memory: {0} %", (UsedPhysicalMemorypercent).ToString("0.0"));
        }

所以我用同样的想法尝试CPU。我知道这个问题被问了很多次,但我没有找到一个正确的解决方案

我正在使用以下代码(我也尝试了_Total):

问题:此代码有什么问题,如何更正以使其正常工作?或者问题出在哪里


PS:我在m_procTimer_Tick事件中使用了这两个代码段,并且计时器设置为1000。

“我没有找到正确的解决方案。”。您还没有解释为什么此代码不起作用。这里的输出有什么问题吗?代码:0:0 | 1:0 | 2:0 | 3:6 | 4:0 | 5:0 |的输出我看到了一些使用PerformanceCounter的解决方案:在一个Thread.Sleep(1000)之间调用了两次NextValue()。我也尝试了这段代码,但它冻结了UI。“我没有找到一个正确的解决方案。”。您还没有解释为什么此代码不起作用。这里的输出有什么问题吗?代码:0:0 | 1:0 | 2:0 | 3:6 | 4:0 | 5:0 |的输出我看到了一些使用PerformanceCounter的解决方案:在一个Thread.Sleep(1000)之间调用了两次NextValue()。我也尝试了这段代码,但它冻结了UI。
        wql = new ObjectQuery("select * from Win32_PerfFormattedData_PerfOS_Processor");
        searcher = new ManagementObjectSearcher(wql);
        results = searcher.Get();
        foreach (ManagementObject obj in results)
        {
            var usage = obj["PercentProcessorTime"];
            var name = obj["Name"];
            Console.WriteLine(name + " : " + usage);
        }