C# NextValue()返回';s0

C# NextValue()返回';s0,c#,performancecounter,C#,Performancecounter,我正在尝试使用PhysicalDisk获取PerformanceCounter类的NextValue。我似乎无法找出原因,但每次都返回0 PerformanceCounter pcDiskTime = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total"); Single sinDisk = pcDiskTime.NextValue(); //returns 0.0 使用上述命令并调用pcDiskTime.Next

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

  PerformanceCounter pcDiskTime = new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
  Single sinDisk = pcDiskTime.NextValue(); //returns 0.0
使用上述命令并调用
pcDiskTime.NextValue
return的
0
。我有其他的柜台,工作正常,并返回我需要的东西

.RawValue
确实返回了一些内容,但不是我需要的值。有什么明显的事情我没有做吗


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

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

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秒,以允许计数器执行 下一次增量读取


这个问题也使我恼火。有几个问题似乎应该有一个简单的解决方案,但我没有看到。第一个当然是,第一个请求上的值0是无用的。既然您已经知道第一个响应是0,为什么函数不考虑它并返回true.NextValue()

第二个问题是,当你试图决定你的应用程序可能有哪些可用资源时,即时阅读可能会非常慢,因为它可能是尖峰,或者在尖峰之间

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

公共静态浮点处理器利用率;
公共静态浮点GetAverageCPU()
{
PerformanceCounter cpuCounter=新的PerformanceCounter(“进程”,处理器时间,%Process.GetCurrentProcess().ProcessName);
对于(int i=0;i<11;++i)
{
ProcessorUtilization+=(cpuCounter.NextValue()/Environment.ProcessorCount);
}
//记住,第一个值是0,所以我们不想在中求平均值。
控制台写入线(处理器利用率/10);
返回处理器利用率/10;
}

MSDN:
如果计数器的计算值取决于两次计数器读取,则第一次读取操作返回0.0
如果每次创建一个新计数器,NextValue将始终是第一个调用(不确定这是否是一个依赖于2次读取的调用)@puropoix很好,我的其他一些计数器确实需要两次读取,我尝试过这个;忘了在我的帖子里提到这个。我会更新的,谢谢你的建议。啊,睡线做了!我不敢相信睡线是它,它没有像我这样叫它两次,只是没有睡线。非常感谢。感谢您提供cpuCounter.NextValue()/Environment.ProcessorCount
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;
}