Mef*_*to1 0 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;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当用户单击开始按钮时,Start方法将触发,它会异步调用不同的方法.当用户单击停止按钮状态时,应更改为"NotMeasuring",这应该结束方法调用.但这不起作用.是因为对StartMeasuring方法的递归调用?我尝试添加一个检查当前状态是否为Measuring,然后再次递归调用该方法.这样就有用了.它在代码中被注释掉了.
如果你想每秒做一些事情,立即解决方案应该是使用a Timer.事实上,在你的情况下,这是一个完全适合这项工作的工具.使用起来比使用起来更容易,效率更高.在构造对象时创建时间,在按钮单击时启动计时器,并在单击其他按钮时停止计时器.它将使所有代码都非常直接地使用.
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |