如何在 C# 中获取每个核心(四核 cpu)的 CPU 负载?
您可以使用 WMI 或 System.Diagnostics 命名空间。从那里您可以获取任何您想要的性能计数器(但是需要一秒钟(1-1.5秒)来初始化这些计数器 - 读取值是可以的,只是初始化很慢)
代码可以如下所示:
using System.Diagnostics;
public static Double Calculate(CounterSample oldSample, CounterSample newSample)
{
double difference = newSample.RawValue - oldSample.RawValue;
double timeInterval = newSample.TimeStamp100nSec - oldSample.TimeStamp100nSec;
if (timeInterval != 0) return 100*(1 - (difference/timeInterval));
return 0;
}
static void Main()
{
var pc = new PerformanceCounter("Processor Information", "% Processor Time");
var cat = new PerformanceCounterCategory("Processor Information");
var instances = cat.GetInstanceNames();
var cs = new Dictionary<string, CounterSample>();
foreach (var s in instances)
{
pc.InstanceName = s;
cs.Add(s, pc.NextSample());
}
while (true)
{
foreach (var s in instances)
{
pc.InstanceName = s;
Console.WriteLine("{0} - {1:f}", s, Calculate(cs[s], pc.NextSample()));
cs[s] = pc.NextSample();
}
System.Threading.Thread.Sleep(500);
}
}
重要的是,你不能依赖本机 .net 计算 100nsInverse 性能计数器(对我来说只返回 0 或 100 ... bug?),但你必须自己计算它,为此你需要每个计数器的最后一个 CounterSamples 的存档实例(实例代表一个核心或这些核心的总和)。
这些实例似乎有一个命名约定:
0,0 - 第一个 cpu 第一个核心 0,1 - 第一个 cpu 第二个核心 0,_Total - 第一个 cpu 的总负载 _Total - 所有cpu的总负载
(未经验证 - 在进一步调查完成之前不建议依赖它)...
由于内核对于操作系统显示为单独的 CPU,因此您可以使用与确定多处理器计算机中每个 CPU 的负载相同的代码。 here就是这样一个例子(C 语言)。请注意,它使用 WMI,因此上面评论中链接的其他线程可能已经让您完成了大部分工作。
首先,您需要与核心一样多的性能计数器(这需要时间,您可能希望在异步任务中执行此操作,否则它会阻塞您的 UI):
CoreCount= Environment.ProcessorCount;
CPUCounters = new PerformanceCounter[CoreCount];
for (var i = 0; i < CoreCount; i++)
CPUCounters[i] = new PerformanceCounter("Processor", "% Processor Time", $"{i}");
然后就可以获取每个核心的使用值了:
public float[] CoreUsage { get; set; } // feel free to implement inpc
public void Update() => CoreUsage = CPUCounters.Select(o => o.NextValue()).ToArray();
但是,您可能想调用
Update()
三次:第一次您总是会得到 0.0
,然后第二次总是得到 0.0
或 100.0
,最后是实际值。
NextValue()
为您提供即时值,而不是一段时间内的平均值;如果您想要平均值超过 1 秒,您可以使用 RawValue
并计算平均值,如下所述:PerformanceCounter.RawValue Property