我知道如何获得CPU负载(每个核心和总数)的问题,有几十个教程或代码片段。
但是让我怀疑的是什么:
在图片上,您可以在左侧看到我的输出,在右侧看到任务管理器。所以我希望_Total(根据任务管理器)的值为13%,而不是1%。为什么1%显示,即使一个核心有6%,另外12%对我来说不是很清楚。
这是我的代码:
public SystemStatsViewModel() {
TimerThread = new Thread(new ThreadStart(TimerThreadMethod))
{
Name = "TimerThread",
IsBackground = true
};
TimerThread.Start();
}
private void TimerThreadMethod()
{
var cpuSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_PerfFormattedData_Counters_ProcessorInformation WHERE Name LIKE '0%'");
string cpuString;
while (true)
{
cpuString = "";
foreach (var obj in cpuSearcher.Get())
{
cpuString += $"{obj["Name"]}: {obj["PercentProcessorTime"]}{Environment.NewLine}";
}
}
}
UPDATE
使用perf计数器我已经尝试过,因此WMI和perf计数器(各种计数器)没有提供所需的值。但Windows下有性能监视器(Win + R,perfmon,Enter)。在这里,您可以在“处理器信息”下找到“处理器负载”指示器。我并不是指“处理器时间(%)”。该值至少最接近任务管理器显示的值。但我无法弄清楚如何检索它。 (我使用德语Windows,已经尝试将其设置为英语,但计数器保留了德语名称,否则我会看到计数器用英语调用(至少在Windows中))。
但是,“处理器负载”或“处理器使用”没有找到任何东西。并且还显示类别处理器信息的计数器不显示该特定计数器。所以它必须是从几个计数器本身计算的东西。
public int GetCPUUsage()
{
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", Environment.MachineName);
cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000);
return (int)cpuCounter.NextValue();
}
我一直在使用它...它似乎匹配任务管理器总CPU值。