2014-03-01 3 views
0

Первоначально я использовал ObservableClass для хранения информации о моем CPU каждый раз и переводил эту информацию в график, который работал, но продолжал добавлять в память.Использование класса очереди для управления памятью

Получил некоторые советы и перешел к выбору класса очереди, чтобы иметь возможность удалять информацию по прошествии определенного периода времени. Но, в отличие от наблюдаемого класса, я не могу хранить 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

Проверить это SO размещать для реализации очереди фиксированной длины - http://stackoverflow.com/questions/5852863/fixed-size-queue-which-automatically-dequeues-old-values-upon-new-enques – siddharth

+0

Tnks для ответа. Я ищу способ реализации очереди таким образом, чтобы она принимала 2 аргумента, аналогичные ObservableCollection. – kar

ответ

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


} 
+0

Это работает. Просто хочу что-то прояснить. Когда вы используете метод .RemoveAt, очищает ли эта информация от памяти или все еще остается в фоновом режиме? – kar

+0

Объект будет сохраняться в памяти после удаления из коллекции до тех пор, пока он не будет помечен для удаления сборщиком мусора. Вы можете заставить сбор мусора использовать 'GC.Collect', но его вообще не рекомендуется. Вы можете прочитать об этом здесь - http://stackoverflow.com/questions/1149197/gc-collect. Также, если вы хотите заставить GC.Collect, вы можете, вероятно, поставить условие, чтобы сделать это, скажем каждые 60 секунд или около того. 'if (_counter% 60 == 0) {GC.Collect; } ' – siddharth

+1

Спасибо за объяснение. :) – kar

Смежные вопросы