使用队列类来管理内存

时间:2014-03-01 11:17:01

标签: c# xaml memory-management queue

我最初使用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时所看到的,我无法包含计数器来跟踪图表上的秒数。这对我来说是新的,因此可能搞砸了整个概念。还在思考我是否添加和删除队列类方式的计数器的方式是混乱的。请指教。谢谢。

1 个答案:

答案 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));
        }
    }


}