6 Stimmen

INotifyPropertyChanged: Was passiert hinter der Szene?

In WPF haben wir zwei Threads (mindestens): Rendering und ein UI-Thread. Wenn ich ein Ereignis OnNotifyPropertyChanged auf einige Eigenschaft ändert, wird es auf dem UI-Thread ausgelöst. Diese Informationen müssen an den WPF-Rendering-Thread zum erneuten Rendern versendet werden. Ich nehme an, es ist in einer synchronen Weise ( Dispatcher.Invoke ) getan, aber wie funktioniert es wirklich?

Wenn ich mehrere OnNotifyPropertyChanged-Ereignisse für dieselbe Datenstruktur auslöse, ohne den Zugriff auf die Accessor-Eigenschaft für diese Datenstruktur zu sperren, für die diese Ereignisse ausgelöst wurden, schaffe ich dann eine potenzielle Race Condition? Ich habe die berüchtigte Ausnahme "Sammlung wurde geändert; Aufzählungsvorgang darf nicht ausgeführt werden" von WPF gesehen, also sieht es aus wie WPF diese Ereignisse asynchron verarbeitet. Habe ich die Ausnahme missverstanden? Vielen Dank!

1voto

Captain Punkte 723

Die Ausnahme "Collection was modified; enumeration operation may not execute" hat nichts mit WPF zu tun, sondern wird von IEnumerator ausgelöst, wenn man mit foreach eine Auflistung durchläuft und dabei die Auflistung irgendwie verändert (hinzufügen/entfernen/verändern). (z. B.: http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/ ) .

Ansonsten bin ich noch nie auf eine Ausnahme gestoßen, die durch mehrere gleichzeitige Aufrufe des PropertyChanged-Ereignisses verursacht wurde.

0voto

Guru Punkte 171

Ich hoffe, Sie beziehen sich auf zwei Threads, wenn Sie von zwei Threads sprechen

  1. Rendering-Thread
  2. UI-Thread.

Ja, Sie haben recht, das Update ist ein ASYNCH

Werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

0voto

Caleb Vear Punkte 2597

Führen Sie selbst irgendwelche Verarbeitungen auf dem Nicht-UI-Thread durch? Ich bin ziemlich sicher, dass die Iteration von Enumerationen, die Sie binden, auf dem UI-Thread durchgeführt werden, so dass, wenn, nachdem Sie das Ereignis auslösen jemand anderes in Ihrer Anwendung die Sammlung ändert Sie diese Ausnahme erhalten würde.

Das Problem sollte nicht durch den Rendering-Thread verursacht werden, der über Ihre Sammlung iteriert, da er das nie tut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X