我正在尝试同时监视 CPU 和内存,并获取与 TaskManager 值匹配(或尽可能接近)的值。到目前为止,我有:
static readonly PerformanceCounter IdleCounter = new PerformanceCounter("Processor", "% Idle Time", "_Total");
static readonly PerformanceCounter RamCounter = new PerformanceCounter("Memory", "Available MBytes");
public string f() {
return "cpu: " + (100-IdleCounter.NextValue()) + " , ram: " + RamCounter.NextValue() + "MB";
}
这为 cpu 提供了相当准确的值(包括与 TaskManager 的比较),但如果可能的话我想更接近。
对于内存,但它似乎不匹配,我得到一个数字,但我真正想要的是一个百分比,如任务管理器显示的那样..
有什么帮助吗?
最佳答案
public string f()
最重要的事情是以与任务管理器相同的速率对这些性能计数器进行采样。对于 % Idle Time
尤其如此,这是一个粒度为 1/64 秒的数字。请务必使用 Timer 或 DispatcherTimer,将其 Interval 设置为 1000。
... new PerformanceCounter("Processor", "% Idle Time", "_Total")
您需要使用不同的计数器,类别为“处理器信息”。该计数器使用一种略有不同的策略来测量性能,它试图补偿超线程内核的不平等行为和处理器时钟频率节流的副作用。在我的机器上,差异约为 4%。请注意,很难获得精确匹配,数字变化很快,您只是偶然与任务管理器的采样时间完全同步。
... new PerformanceCounter("Memory", "Available MBytes")
要将其转换为百分比,您需要从可用的物理 RAM 总量中减去该数字。您可以从 ComputerInfo.TotalPhysicalMemory 获得此号码如 this post 所示.如果你不想使用这个命名空间,常见的提示,那么你必须 pinvoke GlobalMemoryStatusEx() .
我用来验证这些更改的代码:
private void timer1_Tick(object sender, EventArgs e) {
label1.Text = IdleCounter.NextValue().ToString("N0");
double total = new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
var used = 1024.0 * 1024.0 * RamCounter.NextValue();
label2.Text = (100.0 * (total - used) / total).ToString("N0");
}
关于c# - PerformanceCounter CPU & Memory 类似任务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51392374/