96 votes

Comment mettre à jour une ObservableCollection via un fil de travail ?

J'ai un ObservableCollection<A> a_collection; La collection contient "n" éléments. Chaque élément A ressemble à ceci :

public class A : INotifyPropertyChanged
{

    public ObservableCollection<B> b_subcollection;
    Thread m_worker;
}

En fait, tout est relié à une vue de liste WPF et à un contrôle de la vue détaillée qui affiche l'information sur l'entreprise. b_subcollection de l'élément sélectionné dans une liste séparée (liaisons bidirectionnelles, mises à jour en cas de changement de propriété, etc.)

Le problème est apparu lorsque j'ai commencé à mettre en œuvre le threading. L'idée était de faire en sorte que tout le a_collection utilise son fil de travail pour "faire le travail" et met ensuite à jour ses fils de travail respectifs. b_subcollections et faire en sorte que le gui montre les résultats en temps réel.

Lorsque je l'ai essayé, j'ai obtenu une exception disant que seul le thread Dispatcher peut modifier une ObservableCollection, et le travail s'est arrêté.

Quelqu'un peut-il expliquer le problème, et comment le contourner ?

0 votes

Essayez le lien suivant qui fournit une solution à sécurité thread qui fonctionne à partir de n'importe quel thread et peut être liée à plusieurs threads d'interface utilisateur : codeproject.com/Articles/64936/

-2voto

Maxence Points 5619

La réponse de @Jon est bonne mais il manque un exemple de code :

// UI thread
var myCollection = new ObservableCollection<string>();
var lockObject = new object();
BindingOperations.EnableCollectionSynchronization(myCollection, lockObject );

[..]

// Non UI thread
lock (lockObject) 
{
   myCollection.Add("Foo")
}

Notez également que le CollectionChanged sera toujours appelé depuis le fil d'exécution non lié à l'interface utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X