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

 mobiledu2502911403 发布于 2023-02-07 14:20

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

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

    public CPUPerformanceMonitor()
    {
        cpuCounter = new PerformanceCounter();
        cpuUsage = new List();
        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 个回答
  • 如果你想每秒做一些事情,立即解决方案应该是使用a Timer.事实上,在你的情况下,这是一个完全适合这项工作的工具.使用起来比使用起来更容易,效率更高.在构造对象时创建时间,在按钮单击时启动计时器,并在单击其他按钮时停止计时器.它将使所有代码都非常直接地使用.

    2023-02-07 14:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有