性能计数器 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?如何多次获取当前值?
编辑 - 性能计数器详细信息
您需要等待超过 1000 毫秒才能使用 PerformanceCounter
查看可用磁盘空间的变化。 PerformanceCounter("LogicalDisk", "% Free Space")
计数器的刷新率显示为 300 秒。 在此五分钟的时间间隔内重复调用.NextValue()
将产生与您看到的相同的结果。 这个比率仅基于我所做的一些测试,所以我不能说这个值在各种平台上的一致性。
如果您需要更短的采样周期,我只能建议您在读取NextValue
后关闭应用程序。 重新打开应用程序时,您将看到新的PerformanceCounter
实例已拾取最新的磁盘空间度量。 我不相信Close
和Dispose
甚至包装在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"]);
}