NextValue() return 的 0

NextValue() return's 0

我正在尝试使用 PhysicalDisk 获取 PerformanceCounter class 的 NextValue。某些我似乎无法找出原因的原因,每次都是 return 的 0

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

使用上面的方法并调用 pcDiskTime.NextValue return 的 0。我还有其他工作正常的计数器和 return 我需要的。

.RawValue 做了 return 的事情,但不是我需要的价值。有什么明显我没有做的吗?

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

第一次它将 return 归零,因为没有以前的值可以比较,请按以下操作。

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();

If the calculated value of a counter depends on two counter reads, the first read operation returns 0.0. Resetting the performance counter properties to specify a different counter is equivalent to creating a new performance counter, and the first read operation using the new properties returns 0.0. The recommended delay time between calls to the NextValue method is one second, to allow the counter to perform the next incremental read.

这个问题也让我很烦恼。有几个问题似乎应该有一个简单的包来解决,但我没有看到一个。第一个当然是第一个请求的值为 0 是无用的。既然您已经知道第一个响应是 0,为什么该函数不考虑它并且 return 真正的 .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;
}