异步收集CPU使用率数据(在后台工作)

时间:2013-12-30 19:26:52

标签: c# asynchronous performancecounter

我试图通过点击按钮让用户决定何时开始收集CPU使用率。在后台工作时,应用程序每秒获得总CPU使用率,并且仅在使用不同事件时停止这样做,即从不同按钮点击。 我有一个小问题。当我通过按钮点击更改应用程序的状态时,我无法停止应用程序:

class CPUPerformanceMonitor
{
    PerformanceCounter cpuCounter;
    List<float> cpuUsage;
    private delegate void start();
    start sc;
    IAsyncResult iftar;
    MeasureState currState;

    public CPUPerformanceMonitor()
    {
        cpuCounter = new PerformanceCounter();
        cpuUsage = new List<float>();
        sc = new start(StartMeasuring);
        currState = MeasureState.Measuring;

        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";


    }

    public void Start()
    {
        currState = MeasureState.Measuring;

        iftar = sc.BeginInvoke(null, null);

            if (currState == MeasureState.NotMeasuring)
            {
                sc.EndInvoke(iftar);
            }

    }

    private void StartMeasuring()
    {
        cpuUsage.Add(cpuCounter.NextValue());
        Thread.Sleep(1000);

    // if (currState != MeasureState.NotMeasuring)
    // {
                StartMeasuring();
    // }
    }

    public void Stop()
    {
        currState = MeasureState.NotMeasuring;
    }
}

因此,当用户单击开始按钮时,Start方法将触发,它会异步调用不同的方法。当用户单击停止按钮状态时,应更改为“NotMeasuring”,这应该结束方法调用。但是这不起作用。 是因为对StartMeasuring方法的递归调用?我尝试添加一个检查当前状态是否为Measuring,然后再次递归调用该方法。这样就有用了。它在代码中被注释掉了。

1 个答案:

答案 0 :(得分:5)

如果您想每秒做一些事情,立即解决方案应该是使用Timer。事实上,在你的情况下,这是一个完全适合这项工作的工具。与您拥有的工作相比,工作起来更加容易且效率更高。在构造对象时创建时间,在按钮单击时启动计时器,并在单击其他按钮时停止计时器。它将使所有代码都非常直接地使用。