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

Luk*_*uke 7 c# performancecounter cpu-usage

我一直试图在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);

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

无法加载计数器名称数据,因为从注册表中读取了无效的索引

大多数建议的解决方案建议您使用lodctr在凸起的命令窗口中以admin身份重建损坏的项目.但是我想在一个程序中使用PerformanceCounters,这个程序会发布给很多人,所以不希望他们使用命令窗口重建他们的PerformanceCounters.

问题:

  1. 为什么会发生此异常错误?
  2. 你如何正确使用PerformanceCounter呢?
  3. 如何避免让我的程序用户必须打开cmd窗口并重建其性能计数器?

资料来源:

  1. 如何在C中获得cpu使用率

  2. 获取当前的cpu利用率

  3. 如何获得总CPU使用率?

类似的问题,关于访问计数器名称时由Annie Sheikh提出的错误

yoy*_*oyo 1

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

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

如果您遇到权限问题,那么很可能再多的注册表修改也无法让您的代码为所有用户可靠地运行。但我不清楚为什么你的代码在没有管理员权限的来宾帐户上运行良好,考虑到文档的内容。

另一种选择是运行“wmic.exe cpu get loadpercentage”并解析输出,如本答案中所建议的。根据我的测试,这可以从管理员或标准用户帐户运行,但不能从来宾帐户运行。