2008-11-11 12 views
0

Est-ce que quelqu'un a écrit une version de la file d'attente générique de .Net qui implémente INotifyCollectionChanged, ou est-ce qu'il y en a déjà une cachée profondément dans le framework .Net?ObservableQueue?

Répondre

1

Une recherche rapide n'a montré aucun résultat. Mais l'interface est simple et il serait presque trivial d'étendre la classe de file d'attente et d'ajouter un support pour l'interface. Il suffit donc de remplacer toutes les méthodes:

// 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); 
} 
+0

Malheureusement, la classe de file d'attente générique .Net n'autorise pas Enqueue() ou Dequeue() à être substituée dans une classe descendante. –

+0

J'ai fini par créer une classe ObservableQueue qui utilise la méthode de masquage pour remplacer Enqueue() et Dequeue(). Tant que le code de mise en file d'attente ou de dequeueing le fait sur la file d'attente en tant que ObservableQueue, et pas seulement de façon polymorphe comme une file d'attente régulière, les événements se déclencheront. –

+1

Un meilleur pourrait être de ne pas surcharger mais de créer une nouvelle file d'attente (pas d'interface IQueue interface! Bizarre!) Qui prend une file d'attente dans un constructeur et passe juste les appels de méthode à la collection interne – Will

0

J'ai utilisé la même approche que Chris Wenham. Sous la charge, les performances souffrent parce que NotifyCollectionChangedEventArgs nouveau doit être alloué pour chaque Enqueue/Dequeue. Néanmoins, dans la file d'attente, envoyez des arguments avec NotifyCollectionChangedAction.Add, l'élément ajouté et Count-1 comme index. Dans la file d'attente, envoyez les arguments avec NotifyCollectionChangedAction.Remove, l'élément supprimé et l'index 0.