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

时间:2012-01-20 03:44:52

标签: c# performancecounter

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?如何多次获得当前值?

1 个答案:

答案 0 :(得分:4)

编辑 - 效果计数器详细信息

您需要等待超过1000毫秒,才能使用PerformanceCounter查看可用磁盘空间的变化。 PerformanceCounter("LogicalDisk", "% Free Space")计数器的刷新率似乎为300秒。在这五分钟的间隔内反复呼叫.NextValue()将产生与您所看到的相同的结果。此速率仅基于我已完成的某些测试,因此我不能代表各种平台上此值的一致性。

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

<强> DriveInfo

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

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

driveInfo.TotalFreeSpaceDriveInfo类的其他属性。

编辑 - 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"]);
}