如何在不让用户在命令提示符下使用 lodctr 重建的情况下让性能计数器工作?

How can I get performance counter to work without getting the user to rebuild with lodctr in a command prompt?

我一直在尝试在 C# 中获取 windows PC (Windows 7 运行 .Net 4.5) 的总 CPU 使用率。看来使用PerformanceCounter应该可以满足我的需求

我根据下面的三个链接写了一些试用代码(并检查了 msdn 页面),这是最基本的版本:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace EntropyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            PerformanceCounter cpuCounter;

            cpuCounter = new PerformanceCounter();

            cpuCounter.CategoryName = "Processor";
            cpuCounter.CounterName = "% Processor Time";
            cpuCounter.InstanceName = "_Total";


            while(true)
            {
                try
                {
                    float firstValue = cpuCounter.NextValue();
                    System.Threading.Thread.Sleep(500);
                    Console.WriteLine("Before getting processor:");
                    float currentCpuUsage = cpuCounter.NextValue();
                    Console.WriteLine("After getting processor:");
                    System.Threading.Thread.Sleep(1000); 

                    Console.WriteLine(currentCpuUsage);
                }
                catch (Exception e)
                {
                    Console.WriteLine("\n{0}\n", e.Message);
                }
                System.Threading.Thread.Sleep(10000);

            }
        }
    }
}

每当调用 NextValue 时,都会触发以下异常错误。这似乎是性能计数器值问题的常见问题。

Cannot load Counter Name data because an invalid index '' was read from registry

最推荐 solutions 建议您以管理员身份在引发的命令 window 中使用 lodctr 重建损坏的项目。然而,我想在一个将发布给大量人的程序中使用 PerformanceCounters,因此期望他们使用命令 window.

重建他们的 PerformanceCounters 是不合适的

问题:

  1. 为什么会出现这个异常错误?
  2. 否则您如何正确使用 PerformanceCounter?
  3. 如何避免让我的程序用户不得不打开 cmd window 并重建他们的性能计数器?

来源:

  1. How to get cpu usage in C

  2. Get current cpu utilisation in

  3. How can I get the total CPU usage?

Similar Question about error when accessing counter name 安妮谢赫提问

根据 PerformanceCounter.NextValue 的文档,“要读取性能计数器,您必须具有管理权限。”文档还指出,如果“在没有管理权限的情况下执行的代码试图读取性能计数器。

但这是一个谎言。在我的 Windows 7 环境(64 位家庭高级版),运行ning .NET 4.5 上,我可以 运行 你的代码从一个非 raised cmd shell在管理员帐户、标准用户帐户甚至来宾帐户上。

如果您 运行 遇到权限问题,那么很可能没有多少注册表摆弄会让您的代码 运行 对所有用户可靠。但我不清楚为什么你的代码在没有管理员权限的来宾帐户上工作正常,鉴于文档所说。

另一种选择是 运行 "wmic.exe cpu get loadpercentage" 并按照 this answer 中的建议解析输出。根据我的测试,这适用于管理员或标准用户帐户,但不适用于来宾帐户。