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!