Счетчик производительности NextValue возвращает прежнее значение - PullRequest
2 голосов
/ 20 января 2012
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

Почему он продолжает возвращать 41, когда фактическое значение уменьшается до 1? Как я могу получить текущее значение несколько раз?

1 Ответ

4 голосов
/ 27 января 2012

РЕДАКТИРОВАТЬ - Сведения о счетчике производительности

Вам нужно будет подождать более 1000 мс, чтобы увидеть изменение свободного дискового пространства с помощью PerformanceCounter.Частота обновления счетчика PerformanceCounter("LogicalDisk", "% Free Space") составляет 300 секунд.Повторный вызов .NextValue() в течение этого пятиминутного интервала даст тот же результат, что и вы.Этот показатель основан только на некоторых проведенных мною тестах, поэтому я не могу говорить о согласованности этого значения на различных платформах.

Если вам нужен более короткий период выборки, все, что я могу предложить, - это закрыть приложение после того, как вы прочитали NextValue.При повторном открытии приложения вы увидите, что последний экземпляр PerformanceCounter выбрал последнюю меру дискового пространства.Я не верю Close и Dispose или даже добавляя using, и создание нового экземпляра имело тот же эффект.Я не слишком углублялся в детали этой проблемы, так как у меня был выбор использовать следующие опции:

DriveInfo

В качестве альтернативы, если вы не связаны сСчетчик производительности и отслеживания локального диска можно использовать:

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

И driveInfo.TotalFreeSpace или другие свойства класса DriveInfo.

РЕДАКТИРОВАТЬ - 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"]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...