我正在尝试监视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非常准确(与incManager比较)的值,尽管如果可能我想更接近。 对于内存,但它似乎不匹配,我得到一个数字,但我真正想要的是百分比像任务管理器显示..
有帮助吗?
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");
}
您只需要获取计算机上安装的RAM总量和当前使用的RAM。然后将使用过的RAM与总RAM(已使用/总数)相乘,然后将其乘以100;
如果要以%显示已使用的RAM,则应执行以下操作:
//Pseudocode
double totalRam = TotalRam();
double ramUsed = RamUsed();
double ramPercentage = ramUsed / totalRam * 100;
使用该%值,您甚至可以获得以%为单位的RAM
double availableRAM = 100 - ramPercentage;