C# 性能计数器NextValue返回相同的前一个值

C# 性能计数器NextValue返回相同的前一个值,c#,performancecounter,C#,Performancecounter,当实际值下降到1时,为什么它一直返回41?如何多次获取当前值?编辑-性能计数器详细信息 您需要等待1000毫秒以上,才能使用PerformanceCounter查看可用磁盘空间的变化。性能计数器(“LogicalDisk”,“可用空间%)计数器的刷新率似乎为300秒。在这五分钟的间隔内反复调用.NextValue(),将产生与您看到的相同的结果。这个比率只是基于我做过的一些测试,所以我不能保证这个值在不同平台上的一致性 如果您需要更短的采样周期,我建议您在读取NextValue后关闭应用程序。重

当实际值下降到1时,为什么它一直返回41?如何多次获取当前值?

编辑-性能计数器详细信息

您需要等待1000毫秒以上,才能使用
PerformanceCounter
查看可用磁盘空间的变化。
性能计数器(“LogicalDisk”,“可用空间%)
计数器的刷新率似乎为300秒。在这五分钟的间隔内反复调用
.NextValue()
,将产生与您看到的相同的结果。这个比率只是基于我做过的一些测试,所以我不能保证这个值在不同平台上的一致性

如果您需要更短的采样周期,我建议您在读取
NextValue
后关闭应用程序。重新打开应用程序时,您将看到新的
PerformanceCounter
实例已获取磁盘空间的最新度量值。我不相信
Close
Dispose
甚至使用
包装
,然后创建一个新实例会产生相同的效果。我没有深入探讨这个问题的细节,因为我可以选择使用以下选项

DriveInfo

或者,如果您未绑定到性能计数器并且正在监视本地驱动器,则可以使用:

File.Delete("D:\\filler.tmp"); // now %free space is 41
var freeSpaceCounter=new PerformanceCounter("LogicalDisk", "% Free Space", "D:");
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
freeSpaceCounter.Dispose();
freeSpaceCounter.Close();
Thread.Sleep(1000);
Process p = Process.Start("fsutil", "file createnew d:\\filler.tmp 16000000000");
p.WaitForExit(); // now % free space is 1
Thread.Sleep(1000);
freeSpaceCounter = new PerformanceCounter("LogicalDisk", "% Free Space", "D:");
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Thread.Sleep(1000);
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
driveInfo.TotalFreeSpace
driveInfo
类的其他属性

编辑-WMI

如果还需要检查远程计算机,可以使用WMI。也许下面这些对你有用

System.IO.DriveInfo driveInfo = new DriveInfo("D:");

编辑-性能计数器详细信息

您需要等待1000毫秒以上,才能使用
PerformanceCounter
查看可用磁盘空间的变化。
性能计数器(“LogicalDisk”,“可用空间%)
计数器的刷新率似乎为300秒。在这五分钟的间隔内反复调用
.NextValue()
,将产生与您看到的相同的结果。这个比率只是基于我做过的一些测试,所以我不能保证这个值在不同平台上的一致性

如果您需要更短的采样周期,我建议您在读取
NextValue
后关闭应用程序。重新打开应用程序时,您将看到新的
PerformanceCounter
实例已获取磁盘空间的最新度量值。我不相信
Close
Dispose
甚至使用
包装
,然后创建一个新实例会产生相同的效果。我没有深入探讨这个问题的细节,因为我可以选择使用以下选项

DriveInfo

或者,如果您未绑定到性能计数器并且正在监视本地驱动器,则可以使用:

File.Delete("D:\\filler.tmp"); // now %free space is 41
var freeSpaceCounter=new PerformanceCounter("LogicalDisk", "% Free Space", "D:");
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
freeSpaceCounter.Dispose();
freeSpaceCounter.Close();
Thread.Sleep(1000);
Process p = Process.Start("fsutil", "file createnew d:\\filler.tmp 16000000000");
p.WaitForExit(); // now % free space is 1
Thread.Sleep(1000);
freeSpaceCounter = new PerformanceCounter("LogicalDisk", "% Free Space", "D:");
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Thread.Sleep(1000);
freeSpaceCounter.NextSample();
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41
driveInfo.TotalFreeSpace
driveInfo
类的其他属性

编辑-WMI

如果还需要检查远程计算机,可以使用WMI。也许下面这些对你有用

System.IO.DriveInfo driveInfo = new DriveInfo("D:");

我发布的代码在本地和远程机器上都有类似的行为。我需要查询远程计算机上的可用磁盘空间,因此无法使用DriveInfo类。但您必须使用PerformanceCounters吗?换成WMI怎么样?根据我使用PerformanceCounter和逻辑磁盘空间的经验修改了答案。我所发布的代码在本地和远程机器上都有类似的行为。我需要查询远程计算机上的可用磁盘空间,因此无法使用DriveInfo类。但您必须使用PerformanceCounters吗?换成WMI怎么样?根据我使用PerformanceCounter和逻辑磁盘空间的经验修改了答案。希望这能给你一些可以合作的东西。