Maison  >  Article  >  développement back-end  >  Comment puis-je modifier une ObservableCollection à partir d’un thread différent dans une application WPF sans violation d’affinité de thread Dispatcher ?

Comment puis-je modifier une ObservableCollection à partir d’un thread différent dans une application WPF sans violation d’affinité de thread Dispatcher ?

DDD
DDDoriginal
2024-10-30 15:20:51383parcourir

How Can I Modify an ObservableCollection from a Different Thread in a WPF Application Without a Dispatcher Thread Affinity Violation?

Violation d'affinité de thread du Dispatcher avec modification de la collection Observable

Dans une application WPF, certains types de collections, y compris DataGrid, doivent être modifiés à partir du Dispatcher fil de discussion. En effet, ces collections conservent une affinité avec le thread de l'interface utilisateur et tenter de les modifier à partir d'un thread différent peut entraîner des exceptions telles que "Ce type de CollectionView ne prend pas en charge les modifications apportées à sa SourceCollection à partir d'un thread différent du thread Dispatcher."

Dans le code fourni, l'ObservableCollection _matchObsCollection dans le MainWindowViewModel est créé sur le thread de l'interface utilisateur. Cependant, la méthode Load(), qui modifie cette collection, est appelée de manière asynchrone. Cela provoque l'exception car la modification est tentée à partir d'un thread autre que le thread de l'interface utilisateur.

Solution :

Pour résoudre le problème, toute modification de _matchObsCollection doit être effectuée sur le fil de discussion Dispatcher. Ceci peut être réalisé en utilisant la méthode Dispatcher.Invoke() pour déléguer les modifications au thread de l'interface utilisateur.

Voici une version modifiée de la méthode Load() qui utilise Dispatcher.Invoke() pour modifier ObservableCollection. sur le fil de discussion de l'interface utilisateur :

public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Ce code modifié garantit que toutes les modifications apportées à _matchObsCollection sont déléguées au fil de discussion de l'interface utilisateur, résolvant ainsi l'exception.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn