6
votes

InotifyPropertyChanged: Que se passe-t-il derrière la scène?

Dans WPF, nous avons deux threads (au moins): rendu et fil de l'interface utilisateur. Lorsque j'élève un événement surNotifyPropertychangée sur certains changements de propriété, il est soulevé sur le fil de l'interface utilisateur. Ces informations doivent être expédiées au thread de rendu WPF pour le re-rendu. Je suppose que cela se fait de manière synchrone (Dispatcher.invoke) mais comment ça marche vraiment?

Si je soulevais plusieurs événements surNofinyPropertyChanged pour la même structure de données sans verrouiller l'accès à la propriété Accessor pour cette structure de données pour laquelle ces événements ont été soulevés, je crée une condition de course potentielle? J'ai vu la «collection infâme a été modifiée; l'opération de dénombrement peut ne pas exécuter» une exception provenant du WPF, il semble donc que le WPF traite ces événements de manière asynchrone. Suis-je mal comprendre l'exception? Merci!


1 commentaires

Pourquoi ne postez-vous pas un échantillon pour recréer cela? Comme affichez quelques collections que vous changez fréquemment d'un événement DISPATCHERTIMER.


3 Réponses :


0
votes

espoir lorsque vous parlez de deux threads, vous vous référez

  1. Threau de rendu
  2. fil ui.

    Oui, vous avez raison La mise à jour est une asynche

    Jetez un coup d'œil à http://msdn.microsoft.com/fr -US / Magazine / CC163328.ASPX


1 commentaires

Gourou, où dit-il que WPF traite notifypropertychanged événement asynchrone?



1
votes

L'exception "La collection a été modifiée; l'opération de dénombrement peut ne pas exécuter" n'est pas liée à WPF, il est soulevé à partir d'ienumerator lorsque vous avez itéré sur une collection avec percurse et que la collection est modifiée (ajout / supprimer / modifier / modifier ). (par exemple: http: // social.msdn.microsoft.com/forums/fr/netfxbcl/thread/7CE02724-2813-4F7D-8F3C-B1E3C1FD3019/ ) .

Autre que cela, je n'ai jamais rencontré une exception causée par plusieurs invoques simultanés sur l'événement de l'économie de propriété.


2 commentaires

Le point est que la collection est itératée par WPF et non par mon code. Quand je tourne des exceptions de première chance sur, je le vois échouer dans .net


Ma meilleure estimation est que cela se passe parce que vous modifiez la collection lors de la charge du XAML. La liaison tente de se déplacer sur la collection pour le peupler sur vos articlesControl et, en même temps, vous la modifiez. Essayez de le synchroniser.



0
votes

Faites-vous un traitement de votre soi sur le fil non-UI? Je suis assez certain que l'itération de toutes les énumérations que vous souhaitez être effectuées sur le fil de l'interface utilisateur, donc si vous suivez l'événement, quelqu'un d'autre dans votre application modifie la collection que vous obtiendriez cette exception.

Le problème ne doit pas être causé par le thread de rendu itérant sur votre collection car elle ne le fait jamais.


0 commentaires