我正在做一个显示性能数据的表单,我有一些性能计数器,显示有关处理器和内存的一些信息。因为第一个结果总是" 0"我在分配下一个值之前正在做一个睡眠线程。这样做的问题在于它确实使程序变得迟钝。
即使移动窗口也很慢,我打赌它是由于线程休眠事件基本上每隔一秒运行一次。我已将定时器设置为始终以1秒的间隔启用,因为我希望它显示信息"实时"有点。
到目前为止,这是我的代码:
private PerformanceCounter pcProcess; //Process
private PerformanceCounter pcMemory; //Memory
private void tmrProcess_Tick(System.Object sender, System.EventArgs e)
{
pcProcess = new PerformanceCounter(); //New Performance Counter Object
pcProcess.CategoryName = "Processor"; //Specify Process Counter
pcProcess.CounterName = "Interrupts/sec";
pcProcess.InstanceName = "_Total";
pcProcess.NextValue();
System.Threading.Thread.Sleep(1000);
cpInt.Text = pcProcess.NextValue().ToString(); //Display
pcProcess.CounterName = "% Processor Time";
pcProcess.InstanceName = "_Total";
pcProcess.NextValue();
System.Threading.Thread.Sleep(1000);
cpPower.Text = pcProcess.NextValue().ToString() + "%"; //Display
}
private void tmrMemory_Tick(System.Object sender, System.EventArgs e)
{
pcMemory = new PerformanceCounter();
pcMemory.CategoryName = "Memory";
//This counter gives a general idea of how many times information being requested is not where the application (and VMM) expects it to be
pcMemory.CounterName = "Available MBytes";
avlMem.Text = pcMemory.NextValue().ToString() + " Mb";
pcMemory.CounterName = "Page Faults/sec";
pcMemory.NextValue();
System.Threading.Thread.Sleep(1000);
pgFaults.Text = pcMemory.NextValue().ToString();
}
答案 0 :(得分:1)
Thread.Sleep
的想法。它几乎从不一个好主意。PerformanceCounter()
的新实例,只需致电perfmonCounter.NextValue()
。NextValue()
一次,以便在第一次计时器滴答时返回0.0以外的值。请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.nextvalue(v=vs.110).aspx上的remarks
部分:如果计数器的计算值取决于两个计数器读数,则 第一次读取操作返回0.0。重置性能计数器 指定不同计数器的属性相当于创建一个 新的性能计数器,以及使用新的第一个读取操作 属性返回0.0。呼叫之间建议的延迟时间 NextValue方法是一秒钟,以允许计数器执行 下一次增量阅读。
基本上是这样的:
private PerformanceCounter pcMemory;
private void InitPerfmon()
{
this.pcMemory = new PerformanceCounter();
this.pcMemory.CounterName = "Available MBytes";
this.pcMemory.....
...
this.pcMemory.NextValue();
}
private void tmrMemory_Tick(System.Object sender, System.EventArgs e)
{
this.pgFaults.Text = this.pcMemory.NextValue().ToString();
}