性能计数器 NextValue 返回相同的先前值

本文关键字:NextValue 返回 性能计数器 | 更新日期: 2023-09-27 18:20:47

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

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

性能计数器 NextValue 返回相同的先前值

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

您需要等待超过 1000 毫秒才能使用 PerformanceCounter 查看可用磁盘空间的变化。 PerformanceCounter("LogicalDisk", "% Free Space")计数器的刷新率显示为 300 秒。 在此五分钟的时间间隔内重复调用.NextValue()将产生与您看到的相同的结果。 这个比率仅基于我所做的一些测试,所以我不能说这个值在各种平台上的一致性。

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

驱动器信息

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

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

以及DriveInfo类的driveInfo.TotalFreeSpace或其他属性。

编辑 - WMI

如果还需要检查远程计算机,可以使用 WMI。 也许以下内容对您有用。

System.Management.ManagementScope scope = 
    new System.Management.ManagementScope(@"''remoteMachine'root'cimv2");
ObjectQuery query = 
    new ObjectQuery("SELECT Name, Freespace FROM Win32_LogicalDisk WHERE DriveType=3");
ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection results = search.Get();
foreach (ManagementObject mo in results)
{
    Console.WriteLine("Drive: {0} -- Free Space: {1}", mo["Name"], mo["FreeSpace"]);
}