Mise à jour d'un ObservableCollection dans un thread séparé
Dans une application WPF une ObservableCollection est rempli et mis à jour par LINQ to SQL des requêtes. Ensuite, les objets d'INTERFACE utilisateur sont mis à jour en utilisant les valeurs de ce ObservableCollection.
Est-il possible et raisonnable que les opérations de mise à jour de cette ObservableCollection par LINQ to SQL les requêtes ont été exécutées dans un thread séparé?
Si oui, sera, dans ce cas, c'est une seule et même instance de cette ObservableCollection? (Je veux dire, si ce n'est pas le même pour prendre des valeurs de LINQ datacontext et l'un pour donner des valeurs de mise à jour de l'INTERFACE utilisateur, alors je ne vais pas être en mesure de mettre à jour l'INTERFACE utilisateur)
source d'informationauteur rem
Vous devez vous connecter pour publier un commentaire.
Avec le haut-
ObservableCollection<T>
classe, vous ne pouvez pas modifier le contenu à partir d'un thread séparé si l'INTERFACE utilisateur est lié à la collecte, il jette unNotSupportedException
(mais le changement de notification pour les propriétés des éléments de la collection fonctionne très bien). J'ai écrit unAsyncObservableCollection<T>
de la classe pour gérer ce cas. Il fonctionne en invoquant les gestionnaires d'événements sur l'INTERFACE de synchronisation contexte.Net 4.5 fournit une solution dans le BindingOperations classe.
Vous pouvez maintenant utiliser le BindingOperations.EnableCollectionSynchronization méthode comme suit:
J'ai juste essayé ceci dans mon environnement de développement, mais tout semble fonctionner correctement maintenant, quand je l'ai mise à jour de la collection à partir d'un thread d'arrière-plan.
Il y a une discussion plus approfondie de cette solution: http://10rem.net/blog/2012/01/16/wpf-45-observable-collection-cross-thread-change-notification
MSDN entrée de cette méthode est à: https://msdn.microsoft.com/en-us/library/system.windows.data.bindingoperations.enablecollectionsynchronization(v=vs. 110).aspx
Dans notre application, nous avons un TreeView lié à une ObservableCollection, qui nous régulièrement mise à jour dans un thread d'arrière-plan, la demande de données à partir de notre stockage. Il fonctionne parfaitement!Oups. J'ai été mal informé,=))
Droit, nous sommes actuellement à la dérivation de l'
ObservableCollection<T>
et remplacer leOnCollectionChanged
méthode pour éviter de l'INTERFACE utilisateur crossthreading exception. Nous utilisons cette solution:Sans que remplacer, vous obtiendrez une exception comme celle
Maintenant le seul problème que nous avons est le poste sélectionné, dans certains cas, si l'élément actuellement sélectionné est supprimé de la collection de l'Arborescence déplace la sélection vers l'élément suivant (ce qui provoque quelques autres inutiles actions d'INTERFACE utilisateur de notre application). Mais c'est un petit problème.
Essayer de comprendre votre question ici:
Avec le Scénario 1, vous allez avoir à utiliser le thread d'INTERFACE utilisateur. Le thread d'INTERFACE utilisateur est propriétaire de l'ObservableCollection et vous aurez une exception, si vous essayez de l'utiliser dans un autre thread.
Avec le Scénario 2, pouces vers le haut. Tant que vous n'essayez pas d'ajouter ou de supprimer des éléments de la collection elle-même, vous pouvez mettre à jour l'article autant que vous le souhaitez dans un thread d'arrière-plan.