首先,我从8个月前开始学习C#,而且我不会英语。因此,对不起您说不明白的话。
现在,我正在使用C#开发应用程序,以获取CPU使用率百分比。 我想每秒钟获得所有核心的CPU使用率。然后,我使用了PerformanceCounter类和处理器类别。这是我写的代码。
private void GetCpuUsageEvery1sec(object sender, ElapsedEventArgs e)
{
int getValue = 0;
mProcessorCount = Environment.ProcessorCount;
mPerformanceCounter.CategoryName = "Processor";
mPerformanceCounter.CounterName = "% Processor Time";
mPerformanceCounter.InstanceName = "_TOTAL";
getValue = (int)Math.Truncate(mPerformanceCounter.NextValue());
mProcessorCpuUsage[mProcessorCount] = getValue; //I set TOTAL's usage in last of Array
Console.WriteLine(DateTime.Now.ToString());
Console.WriteLine("Core:TOTAL {0}%", mProcessorCpuUsage[mProcessorCount]);
for (int count = 0; count < mProcessorCount; count++)
{
mPerformanceCounter.InstanceName = count.ToString(); //this code is case
getValue = (int)Math.Truncate(mPerformanceCounter.NextValue());
mProcessorCpuUsage[count] = getValue;
Console.WriteLine("Core:{0} {1}%", count, mProcessorCpuUsage[count]);
}
Console.WriteLine();
}
我还编写了带有计时器类的方法,该方法也将GetCpuUsageEvery1sec方法启动为事件。
但是,在“处理器”类别(或“处理器时间计数器”)中,如果我更改InstanceName,则此计数器抛出0。 因此,如果我使用计时器类来执行方法,我将不会仅获得0。
我认为,如果我想获得正确的CPU使用率,则应该使实例数与Core数相同。 (而且许多用户将使用此应用程序。因此,我无法提前指定Core的数量。)
在这种情况下,我无法获得其他解决方案?
答案 0 :(得分:1)
我建议您使用WMI查询:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
var cpuTimes = searcher.Get()
.Cast<managementobject>()
.Select(mo => new
{
Name = mo["Name"],
Usage = mo["PercentProcessorTime"]
}
)
.ToList();
使用计时器将其连接起来,您会感到满意,然后对每个内核使用for
循环会更好。