Avevo la necessità di monitorare la cpu di un pc che ogni tanto schizzava al 100%.
Ho fatto una ricerca veloce in internet ma non ho trovato niente di facilmente utilizzabile (se avete suggerimenti li accetto volentieri).
Ricordando dalla certificazione del framework che c’era la possibilità di leggere i PerformanceCounter ho scritto una piccola classe che fa al caso mio.
public class ProcessorTimeMonitor
{
public delegate void AlertEventHandler(object sender, EventArgs e);
public event AlertEventHandler OnAlert;
public delegate void DetectEventHandler(object sender, DetectEventArgs e);
public event DetectEventHandler OnDetect;
private System.Timers.Timer timer = null;
private PerformanceCounter pc;
private int occurrences = 0;
private float processorTimeLimit;
private int occurrencesLimit;
public ProcessorTimeMonitor(float processorTimeLimit, int occurrencesLimit)
{
this.processorTimeLimit = processorTimeLimit;
this.occurrencesLimit = occurrencesLimit;
pc = new PerformanceCounter("Processor", "% Processor Time", "_Total");
timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(Detection);
}
private void Detection(object sender, System.Timers.ElapsedEventArgs e)
{
float value = pc.NextValue();
if (OnDetect != null)
OnDetect(this, new DetectEventArgs(value));
if (value >= processorTimeLimit)
occurrences++;
else
occurrences = 0;
if (occurrences > occurrencesLimit)
{
occurrences = 0;
if (OnAlert != null)
OnAlert(this, new EventArgs());
}
}
public void Start()
{
timer.Start();
}
public void Stop()
{
timer.Stop();
}
public class DetectEventArgs : EventArgs
{
public DetectEventArgs(float value)
{
this.Value = value;
}
public float Value { get; set; }
}
}