Rapide, performant et thread-safe collection observable
ObservableCollection
s élever les notifications pour chaque action effectuée sur eux. Tout d'abord ils n'ont pas de vrac d'ajouter ou de supprimer des appels, d'autre part ils ne sont pas thread-safe.
N'est-ce pas faire plus lent? Cant, nous avons une alternative plus rapide? Certains disent ICollectionView
enroulé autour d'un ObservableCollection
est rapide? Comment vrai est cette revendication.
- Essayez cette collection qui prend soin de ce problème ainsi que d'autres multi-thread problèmes (même si tout faussé solution sera plus lent), qui aura inévitablement des cultures avec d'autres approches : codeproject.com/Articles/64936/...
- Quand vous dites "thread-safe" voulez-vous dire que vous devez être en mesure de mettre à jour la collection à partir de plusieurs threads?
Vous devez vous connecter pour publier un commentaire.
ObservableCollection
peut être rapide, si il veut pour. 🙂Le code ci-dessous est un très bon exemple d'un thread-safe, plus rapide collection observable et vous pouvez l'étendre en outre à votre souhait.
Aussi
ICollectionView
qui se trouve au-dessus de laObservableCollection
activement au courant des changements et effectue des opérations de filtrage, de regroupement, de tri relativement rapide par rapport à toute autre source de la liste.De nouveau observable collections ne peut pas être un parfait réponse plus rapide des données mises à jour, mais ils font leur travail assez bien.
ICollectionView
etObservableCollection
paireObservableCollection
soulève un seulCollectionChanged
événement avecAction=Add
. WPF serait terriblement inefficace si nécessaire une actualisation complète pour chaque collection de changement! Le po présente une collection avec une API et le nom qui est censé être rapide lorsqu'il est en fait va être beaucoup plus lent dans la grande majorité des cas d'utilisation.CollectionChanged
de l'événement (etNotifyCollectionChangedEventArgs
classe) déjà répondre à un événement unique pour informer de multiples ajouts/suppressions/peu importe, pourvu que ces modifications sont séquentielle au sein de la collection.AddItems
mise en œuvre est pratique pour un grand nombre d'éléments. Pour quelques centaines cela ne me surprend même pas la peine d'utiliserAddItems
. Mais l'amélioration de la performance que j'obtiens lorsque j'ajoute multi-des milliers d'articles de la collection est importante. Vous pouvez tester vous-même. Une remise à zéro pour 1000 nouvellement ajouté des articles et 1000 notifications de faire beaucoup de différence. Aussi WPF élément conteneur réutilise virtualisé articles de toute façon. Donc même pourReset
appel, l'élément conteneur réutilise indi lignes.Voici une compilation de quelques solutions que j'ai fait. L'idée de la collecte changé invokation prises à partir de la première réponse.
Semble aussi que le "Reset" de l'opération doit être synchrone avec le thread principal sinon des choses étranges se produisent à CollectionView et objet collectionviewsource.
Je pense que c'est parce que sur "Reset" gestionnaire essaie de lire la collection de contenu immédiatement et ils devraient être déjà en place.
Si vous n' "Reset" async et que juste ajouter quelques éléments aussi async que récemment ajouté des éléments pourraient être ajoutés à deux reprises.
Je ne peux pas ajouter des commentaires parce que je ne suis pas assez cool, mais le partage de cette question, j'ai couru en vaut probablement la peine de poster même si c'est pas vraiment une réponse. J'ai continué à obtenir un "Index était hors de portée" exception à l'aide de cette FastObservableCollection, en raison de la BeginInvoke. Apparemment, les changements notifiés peut être annulée avant que le gestionnaire est appelé, pour fixer ce j'ai passé la suite de la quatrième paramètre de la BeginInvoke appelé à partir de la OnCollectionChanged méthode (par opposition à l'utilisation de l'événement args un):
Au lieu de cela:
Ce fixe la "Index était hors de portée" de l'émission, j'ai été en cours d'exécution dans. Voici une explication plus détaillée /code snpipet: Où puis-je obtenir un thread-safe CollectionView?
Un exemple où est créé un synchronisé Observables liste: