Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用性能计数器的任务管理器中的CPU使用率_C#_Windows_Performance_Cpu Usage_Performancecounter - Fatal编程技术网

C# 使用性能计数器的任务管理器中的CPU使用率

C# 使用性能计数器的任务管理器中的CPU使用率,c#,windows,performance,cpu-usage,performancecounter,C#,Windows,Performance,Cpu Usage,Performancecounter,[我的尝试] 已经通过 但处理器的“_Total”实例会给出CPU的总消耗量,而不是特定的应用程序或“进程” ,解释了它,但没有说明如何检索此值 转介后 我明白了 TotalProcessorTimeCounter = new PerformanceCounter("Process", "% Processor Time", processName); 基线为(逻辑CPU数量*100) 基本上,这并没有给我一个超过CPU消耗100%的尺度 尝试在任务管理器周围搜索,发现任务管理器->处理器

[我的尝试]

已经通过

  • 但处理器的“_Total”实例会给出CPU的总消耗量,而不是特定的应用程序或“进程”

  • ,解释了它,但没有说明如何检索此值

  • 转介后

    我明白了

    TotalProcessorTimeCounter = new PerformanceCounter("Process", "% Processor Time", processName);
    
    基线为(逻辑CPU数量*100) 基本上,这并没有给我一个超过CPU消耗100%的尺度

    尝试在任务管理器周围搜索,发现任务管理器->处理器->CPU使用率为100

    Processor\%Processor Time对象未将进程名称作为输入。它只有“_Total”作为输入

    [问题]


    对于多核系统的特定进程,如何使用超过100的性能计数器获取此数据(CPU消耗)?

    这给出了您在Task Manager(在
    详细信息
    选项卡中)上获得的确切数字,这是您想要的吗

    // Declare the counter somewhere
    var process_cpu = new PerformanceCounter(
                                       "Process", 
                                       "% Processor Time", 
                                       Process.GetCurrentProcess().ProcessName
                                            );
    // Read periodically
    var processUsage = process_cpu.NextValue() / Environment.ProcessorCount;
    

    在阅读了这个性能计数器文档之后,我意识到获得这个值的正确方法实际上是取100并减去所有处理器的空闲时间

    %Processor Time是处理器用于执行非空闲线程的已用时间百分比


    这给出的值非常接近Task Manager显示的值,可能只是由于四舍五入或轮询计数器的特定时间,在某些点上有所不同。

    如果使用此值,则可以使用Task Manager获得相同的结果:

    cpuCounter = new PerformanceCounter(
            "Processor Information",
            "% Processor Utility",
            "_Total",
            true
        );
    

    抱歉,如果我太天真了,任务管理器就是这样做的吗?只是curious@RonakAgrawal我真的不知道,我从来没有看过任务管理器的源代码,也没有尝试过破解它。我所能说的就是(如果四舍五入到无小数),我从这段代码中得到的数字与在任务管理器中得到的数字相同。我做了一个简单的测试项目,并做了一个测试。这是在8核单CPU(I7860)上实现的。
    11.99063
    是我在
    processUsage
    上得到的值,我也在尝试相同的方法。任务管理器似乎只是在对这些值进行修约。谢谢你的时间。这里有一个可能不相关的旁注。有操作系统性能计数器和硬件性能计数器。PerformanceCounter返回操作系统版本。有时操作系统和硬件计数器相同,有时不同。这一切都与非标准硬件实现和需要在不同硬件架构上运行的操作系统有关。工作正常,但这个值与任务管理器的值相差不大
    cpuCounter = new PerformanceCounter(
            "Processor Information",
            "% Processor Utility",
            "_Total",
            true
        );