Наблюдаемая очередь?

Кто-нибудь написал версию универсальной очереди .Net, которая реализует INotifyCollectionChanged, или где-то уже есть одна скрытая глубоко в структуре .Net?


person Chris Wenham    schedule 11.11.2008    source источник


Ответы (2)


Быстрый поиск результатов не дал. Но интерфейс прост, и было бы почти тривиально расширить класс Queue и добавить поддержку интерфейса. Просто переопределите все методы таким образом:

// this isn't the best code ever; refactor as desired
protected void OnCollectionChanged( NotifyCollectionChangedEventArgs ccea){
  var temp = CollectionChanged;
  if(temp != null) temp(this, ccea);  
}

// and later in the class

public override SomeMethodThatAltersTheQueue(object something){
  // record state of collection prior to change
  base.SomeMethodThatAltersTheQueue(something)
  // create NotifyCollectionChangedEventArgs with prior state and new state
  OnCollectionChanged(ccea);
}
person Community    schedule 11.11.2008
comment
К сожалению, универсальный класс Queue .Net не позволяет переопределять Enqueue() или Dequeue() в классе-потомке. - person Chris Wenham; 11.11.2008
comment
В итоге я создал класс ObservableQueue, который использует скрытие методов для переопределения Enqueue() и Dequeue(). Пока код, помещающий в очередь или удаляющий из очереди, делает это в очереди как ObservableQueue, а не только полиморфно, как в обычной очереди, события будут срабатывать. - person Chris Wenham; 14.11.2008
comment
Лучше не переопределять, а создать новую очередь (без интерфейса IQueue‹T›! странно!), которая принимает Queue‹T› в конструкторе и просто передает вызовы методов во внутреннюю коллекцию - person ; 17.11.2008

Я использовал тот же подход, что и Крис Уэнам. Под нагрузкой производительность снижается, поскольку для каждой постановки в очередь/удаления из очереди необходимо выделить новые NotifyCollectionChangedEventArgs.

Несмотря на это, в Enqueue отправьте аргументы с NotifyCollectionChangedAction.Add, добавленным элементом и Count-1 в качестве индекса. В Dequeue отправьте аргументы с NotifyCollectionChangedAction.Remove, удаленным элементом и индексом 0.

person Ed Noepel    schedule 18.09.2009