我试图通过点击按钮让用户决定何时开始收集CPU使用率.在后台工作时,应用程序每秒获得总CPU使用率,并且仅在使用不同事件时停止这样做,即从不同按钮点击.我有一个小问题.当我通过按钮点击更改应用程序的状态时,我无法停止应用程序:
class CPUPerformanceMonitor { PerformanceCounter cpuCounter; ListcpuUsage; 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,然后再次递归调用该方法.这样就有用了.它在代码中被注释掉了.
如果你想每秒做一些事情,立即解决方案应该是使用a Timer
.事实上,在你的情况下,这是一个完全适合这项工作的工具.使用起来比使用起来更容易,效率更高.在构造对象时创建时间,在按钮单击时启动计时器,并在单击其他按钮时停止计时器.它将使所有代码都非常直接地使用.