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# 获取Windows中空闲进程的CPU总时间,类似于任务管理器_C#_Windows - Fatal编程技术网

C# 获取Windows中空闲进程的CPU总时间,类似于任务管理器

C# 获取Windows中空闲进程的CPU总时间,类似于任务管理器,c#,windows,C#,Windows,我正在开发一个大型应用程序,希望了解CPU在两个时间点之间的负载情况。我不仅对自己的流程感兴趣,而且对所有流程都感兴趣 我的想法是获得两个时间段之间空闲进程的CPU总时间。然后将该值与实时差值进行比较。然后,可以计算空闲进程上花费的平均%CPU时间,从而计算实际进程上花费的平均%CPU时间 例如: 实时样本:2012/07/30 13:56:1和2012/07/30 13:56:21 空闲进程总CPU时间示例:56:23:10和56:23:15 实时性差异:20秒 空闲进程总CPU时间差异:5

我正在开发一个大型应用程序,希望了解CPU在两个时间点之间的负载情况。我不仅对自己的流程感兴趣,而且对所有流程都感兴趣

我的想法是获得两个时间段之间空闲进程的CPU总时间。然后将该值与实时差值进行比较。然后,可以计算空闲进程上花费的平均%CPU时间,从而计算实际进程上花费的平均%CPU时间

例如:

  • 实时样本:2012/07/30 13:56:1和2012/07/30 13:56:21
  • 空闲进程总CPU时间示例:56:23:10和56:23:15
  • 实时性差异:20秒
  • 空闲进程总CPU时间差异:5s
  • 空闲进程中CPU时间的平均百分比:25%
  • 实际进程中的平均CPU时间百分比:75%
为了尽可能减少对性能的影响,我只想采集两个样本。一个在开头,一个在结尾

我也不想为了计算CPU的总负载而看其他进程,只有空闲进程。(例如,我不想计算其他进程的总CPU时间之和)

我已尝试使用Kernel32.dll。但显然,您无法访问空闲进程。它抛出错误\u访问\u拒绝异常

这必须是可能的,因为任务管理器显示空闲进程的总CPU时间


注意:我对进程的瞬时CPU时间百分比不感兴趣。仅计算总CPU时间,以便以后计算平均值。

空闲进程很可能不存在

您可以尝试使用自己的“空闲进程”,该进程包含[no.of cores]线程、空闲+1优先级、CPU循环,并计算运行时间。那可能行得通


它还可以锻炼你的冷却系统,让你的办公室暖和起来:)

你可能正在寻找这样的东西:

static Program
{
    private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
        CategoryName = "Processor", 
        CounterName = "% Processor Time", 
        InstanceName = "_Total" };

    static void Main()
    {
        cpuCounter.NextValue();
        // Do your processing here.
        float totalCpuUsagePercentage = cpuCounter.NextValue();
    }
}
totalCpuUsagePercentage将包含自上次cpuCounter.NextValue()以来的总负载百分比

如果您不想要百分比,可以使用CounterName=“处理器时间”代替


希望这能帮助您完成任务。

记住使用System.Diagnostics;空闲进程在某种程度上确实存在。您可以使用ProcessID为0的内核32 API调用OpenProcess访问它。但是,您不能从用户空间应用程序访问它,因为它是一个受保护的进程。但是任务管理器可以以某种方式访问这些信息。我想知道任务经理是如何做到这一点的。我正在寻找一个低影响优雅的解决方案,虽然。。。