我最初使用ObservableClass每秒存储我的CPU使用率信息,并将此信息移动到一个有效但继续添加到内存的图表中。
得到一些建议,并选择让Queue类在一段时间过后能够删除信息。但与可观察的类不同,我不能存储2个参数。
我是否应该同时使用队列和可观察类或队列类来解决我的问题。
使用Observable类的初始代码
class CPUClass{
ObservableCollection<KeyValuePair<double, double>> cpuChartList = new ObservableCollection<KeyValuePair<double, double>>();
//this method is fired off every second
private void timerChange(){
counter += 1;
//cpuCurrent is the current cpu usage value every second
cpuChartList.Add(new KeyValuePair<double, double>(counter, cpuCurrent));
}
}
//On the MainWindow
cpulineChart.DataContext = CPUClass.cpuChartList;
尝试使用队列类
class CPUClass{
Queue queueCPU = new Queue();
//to hold past 30 seconds cpu usage information at any point
private void timerChange(){
counter += 1;
if (queueCPU.Count > 30)
{
queueCPU.Dequeue();
counter -= 1;
}
queueCPU.Enqueue(cpuCurrent);//
}
}
//On the MainWindow
cpulineChart.DataContext = CPUClass.queueCPU;
正如您在使用Queue Class时所看到的,我无法包含计数器来跟踪图表上的秒数。这对我来说是新的,因此可能搞砸了整个概念。还在思考我是否添加和删除队列类方式的计数器的方式是混乱的。请指教。谢谢。
答案 0 :(得分:1)
我这里没有使用过队列,但我认为这就是你想要做的。您希望每秒更新您的可观察集合并删除其中存储的最旧项目。基于此,我提供了以下代码。
希望这有帮助。
public class CPUClass
{
public ObservableCollection<KeyValuePair<double, double>> cpuChartList = new ObservableCollection<KeyValuePair<double, double>>();
private object _lock = new object();
private int _counter;
private int _Limit = 30; //max 30 secs of data
Timer _timer;
public CPUClass()
{
_timer = new Timer(1000);
_timer.Elapsed += _timer_Elapsed;
_timer.Enabled = true;
_counter = 0;
}
void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
App.Current.Dispatcher.Invoke(() => UpdateCollection());
}
void UpdateCollection()
{
lock (_lock)
{
_counter += 1;
//Get the CpuUsage
var cpuCurrent = GetCpuUsage();
//Remove the oldest item
if (cpuChartList.Count >= _Limit)
cpuChartList.RemoveAt(0);
cpuChartList.Add(new KeyValuePair<double, double>(_counter, cpuCurrent));
}
}
}