나는 프로세서로드를 얻어야하는 C# 어플리케이션을 가지고 있습니다. 대답 this 질문에 대한 대답에 따르면, 내 옵션은 WMI 또는 System.Diagnostics 네임 스페이스의 성능 카운터를 사용하는 것입니다. 내 유일한 옵션은 WMI를 사용하기 때문에 System.Diagnostics 성능 카운터 (here)에 설명 된 문제가 있습니다. 다음 코드는 내가 WMI를 사용하여 프로세서 부하를 읽는 방법을 보여줍니다WMI에서 프로세서로드를 더 빨리 읽도록하기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
namespace ProcessorUtilizationSpike
{
class Program
{
private static ManagementObject processor;
static void Main(string[] args)
{
processor = new ManagementObject("Win32_PerfFormattedData_PerfOS_Processor.Name='_Total'");
while(true)
{
PrintTimedMeasure();
}
}
static void PrintTimedMeasure()
{
DateTime start = DateTime.Now;
UInt64 wmi = WMIMeasure();
DateTime stop = DateTime.Now;
Console.WriteLine("wmi : " + wmi + ", time: " + (stop - start));
}
static UInt64 WMIMeasure()
{
processor.Get();
return ((UInt64)processor.Properties["PercentProcessorTime"].Value); // this property corresponds to a UInt64, see the Type property.
}
}
}
내 문제는 출력의 전형적인 조각에서 볼 수있는대로, 프로세서 사용률을 검색하기 위해 주위에 0.5 초 소요입니다 :
wmi : 6, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5156250
wmi : 4, time: 00:00:00.5000000
wmi : 3, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5000000
짐작하기에 너무 오래 걸리는 이유 중 적어도 일부는 Get 메서드 호출이 ManagementObject 개체의 다른 속성을 업데이트한다는 것입니다. 그래서 내 질문은 : Get 메서드 호출 업데이트를 빠르게 만들 수 있습니까? 솔루션은 어떻게 든 ProcessorObject 속성을 업데이트하기 위해 ManagementObject 개체를 알리는 것입니다.하지만이를 수행하는 방법을 모르겠습니다.
출력의 샘플 시간이 0.5 초 정도로 매우 안정적인지는 궁금하지만, 솔루션에 대한 힌트를 줄 수 있는지 확실하지 않습니다.
감사합니다. 몇 가지 부정확성에 신경 쓰지 않는다면 샘플링 시간을 줄이는 방법에 대해 알고 있습니까? – Boris
WMI를 사용하지 않는 경우 PerformanceCounter를 직접 사용하여 수행 할 수 있습니다. –
샘플 코드에 대한 링크가 업데이트되었습니다. –