我试图通过点击按钮让用户决定何时开始收集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,然后再次递归调用该方法。这样就有用了。它在代码中被注释掉了。
答案 0 :(得分:5)
如果您想每秒做一些事情,立即解决方案应该是使用Timer
。事实上,在你的情况下,这是一个完全适合这项工作的工具。与您拥有的工作相比,工作起来更加容易且效率更高。在构造对象时创建时间,在按钮单击时启动计时器,并在单击其他按钮时停止计时器。它将使所有代码都非常直接地使用。