我想每 1 秒获得 CPU 使用率(所有核心)
I want to get CPU usage (all of core) every 1sec
首先,我从8个月前开始学习C#,我的英语不好。所以,如果我说了一些你无法理解的话,我很抱歉。
现在,我正在使用 C# 开发获得 CPU 使用百分比的应用程序。
我想每秒钟获得 CPU 所有核心的使用率。然后我使用了 PerformanceCounter Class 和 Processor Category。这是我写的代码。
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();
}
我也用定时器 Class 编写了方法,将 GetCpuUsageEvery1sec 方法作为事件启动。
但是,在处理器类别(或处理器时间计数器)中,如果我更改 InstanceName,此计数器将抛出 0。
因此,如果我使用 Timer Class.
执行方法,我不能只得到 0
我认为如果我想获得正确的 CPU 用法,我应该使实例的核心数相同。 (而且很多用户都会用到这个应用,所以我不能提前指定Core的数量。)
在这种情况下,我找不到其他解决方案吗?
我建议您使用 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
循环。
首先,我从8个月前开始学习C#,我的英语不好。所以,如果我说了一些你无法理解的话,我很抱歉。
现在,我正在使用 C# 开发获得 CPU 使用百分比的应用程序。 我想每秒钟获得 CPU 所有核心的使用率。然后我使用了 PerformanceCounter Class 和 Processor Category。这是我写的代码。
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();
}
我也用定时器 Class 编写了方法,将 GetCpuUsageEvery1sec 方法作为事件启动。
但是,在处理器类别(或处理器时间计数器)中,如果我更改 InstanceName,此计数器将抛出 0。 因此,如果我使用 Timer Class.
执行方法,我不能只得到 0我认为如果我想获得正确的 CPU 用法,我应该使实例的核心数相同。 (而且很多用户都会用到这个应用,所以我不能提前指定Core的数量。)
在这种情况下,我找不到其他解决方案吗?
我建议您使用 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
循环。