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;
}