我该如何在C#中获取每个核心(四核心CPU)的CPU负载?
谢谢 :)
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);
}
}
NextValue()
函数从 NextSample()
函数计算结果。第一个结果为 0,第二个结果为 0 或 100%,第三个结果为实际值,因此 "只有 0 或 100" 不是错误。 - SoleilCalculate
是错误的。你可能想使用 GetValue()
而不是 GetSample()
,然后再进行计算。 - Soleil由于内核在操作系统中显示为单独的 CPU,因此您可以使用与多处理器机器中每个 CPU 的负载确定所使用的相同代码。其中一个示例(使用 C 语言)在这里。请注意,它使用 WMI,因此上面评论中链接的其他线程可能已经为您提供了大部分内容。
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