Maison  >  Article  >  développement back-end  >  Comment modifier en toute sécurité les collections observables à partir des threads d'arrière-plan dans WPF ?

Comment modifier en toute sécurité les collections observables à partir des threads d'arrière-plan dans WPF ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 07:28:27615parcourir

How to Safely Modify ObservableCollections from Background Threads in WPF?

Affinité de thread d'interface utilisateur et modifications d'ObservableCollection

Aperçu du problème

Lors de la mise à jour d'une ObservableCollection liée à un DataGrid à partir d'un thread autre que le thread d'interface utilisateur, un Une exception peut se produire : "Ce type de CollectionView ne prend pas en charge les modifications apportées à sa SourceCollection à partir d'un thread différent du thread Dispatcher."

Comprendre l'affinité du thread de l'interface utilisateur

Les collections observables sont créées sur le thread de l'interface utilisateur. En conséquence, ils ont une affinité pour ce fil, ce qui signifie que les modifications ne peuvent être apportées qu’à partir du même fil. Tenter de les modifier à partir d'un autre thread (par exemple, un thread d'arrière-plan) déclenchera l'exception.

Solution : appelez le répartiteur d'interface utilisateur

Pour résoudre le problème, appelez le répartiteur d'interface utilisateur lors de la mise à jour de l'ObservableCollection à partir de un fil différent. Cela déléguera l'opération au thread de l'interface utilisateur, où elle pourra être exécutée en toute sécurité.

Code ViewModel mis à jour

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

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        // This syntax invokes the UI dispatcher 
        // and modifies the ObservableCollection on the UI thread
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Liaison de données asynchrone et actualisation de DataGrid

Pour lier un DataGrid de manière asynchrone et actualisez-le si nécessaire :

  1. Implémentez le chargement asynchrone : Utilisez des méthodes asynchrones (comme AsyncDelegateCommand) pour charger des données dans votre ObservableCollection.
  2. Abonnez-vous à l'événement CollectionChanged : Abonnez-vous à l'événement CollectionChanged de ObservableCollection pour être informé des modifications et mettez à jour le DataGrid en conséquence.
  3. Déclenchez l'actualisation du DataGrid : Utilisez Items.Refresh() sur le DataGrid pour actualiser manuellement ses données.

Exemple

// Bind DataGrid to ObservableCollection
DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection"));

// Subscribe to CollectionChanged event
MatchObsCollection.CollectionChanged += (s, e) =>
{
    DataGrid.Items.Refresh();
};

En suivant ces directives, vous pouvez mettre à jour en toute sécurité les ObservableCollections et lier les DataGrids de manière asynchrone tout en vous assurant que les modifications sont apportées sur le bon fil.

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