NextValue()返回0

时间:2016-12-03 16:27:02

标签: c# performancecounter

我正在尝试使用NextValue获取PerformanceCounter课程的PhysicalDisk。有些原因我似乎无法找出原因,每次都会返回0

  PerformanceCounter pcDiskTime = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
  Single sinDisk = pcDiskTime.NextValue(); //returns 0.0

使用上述内容并致电pcDiskTime.NextValue返回0。我有其他的计数器正常工作并返回我需要的东西。

.RawValue确实会返回一些内容,但这不是我需要的值。有什么明显的东西我不做吗?

注意:我已经通过Performance Monitor验证了这些确实是正确的类别,计数器名称和实例名称。我还尝试两次调用.NextValue()两次,有时候第一次返回0.0,但这没有帮助。

2 个答案:

答案 0 :(得分:5)

第一次它将返回零,因为没有先前要比较的值,请执行以下操作。

PerformanceCounter pcDiskTime = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
//first time call 
float perfCounterValue = pcDiskTime.NextValue();
//wait some time
System.Threading.Thread.Sleep(1000);
//get the value again
perfCounterValue = pcDiskTime.NextValue();
  

如果计数器的计算值取决于两个计数器读数,则   第一次读取操作返回0.0。重置性能计数器   指定不同计数器的属性相当于创建一个   新的性能计数器,以及使用新的第一个读取操作   属性返回0.0。呼叫之间建议的延迟时间   NextValue方法是一秒钟,以允许计数器执行   下一次增量阅读。

答案 1 :(得分:1)

这个问题也让我很烦。似乎有几个问题应该解决一个简单的程序包,但我没有看到。第一个当然是第一个请求的值为0是无用的。既然您已经知道第一个响应为0,那么为什么函数不将其考虑在内并返回true .NextValue()?

第二个问题是,当试图确定应用可能会由于峰值或两次峰值之间的可用资源而做出决策时,可能会瞬间获取瞬时读数。

我的解决方案是执行一个for循环,该循环循环并为您提供过去几秒钟的平均值。您可以调整计数器以使其变短或变长(只要大于2)。

public static float ProcessorUtilization;

public static float GetAverageCPU()
{
    PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
    for (int i = 0; i < 11; ++i)
    {
        ProcessorUtilization += (cpuCounter.NextValue() / Environment.ProcessorCount);
    }
    // Remember the first value is 0, so we don't want to average that in.
    Console.Writeline(ProcessorUtilization / 10); 
    return ProcessorUtilization / 10;
}