编写PerformanceCounters的最佳方法

时间:2014-10-03 12:36:21

标签: c# winforms

我正在做一个显示性能数据的表单,我有一些性能计数器,显示有关处理器和内存的一些信息。因为第一个结果总是" 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();
    }

1 个答案:

答案 0 :(得分:1)

  

如果计数器的计算值取决于两个计数器读数,则   第一次读取操作返回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();
}