WPF ObservableCollection und Hintergrund-Thread-Updates: Ein Leitfaden zur Thread-Sicherheit
WPFs ObservableCollection
vereinfacht die Datenbindung, aber die Aktualisierung über Hintergrundthreads erfordert einen sorgfältigen Umgang mit der Thread-Sicherheit. In diesem Artikel wird das Problem erläutert und eine Lösung mit .NET 4.5-Funktionen vorgestellt.
Die Herausforderung: Thread-Sicherheit mit ObservableCollection
Das direkte Ändern eines ObservableCollection
aus einem Arbeitsthread löst eine Ausnahme aus, da WPF verlangt, dass der UI-Thread Änderungen an gebundenen Sammlungen verarbeitet.
Die Lösung: .NET 4.5-Synchronisierung
.NET 4.5 führt BindingOperations.EnableCollectionSynchronization
ein und vereinfacht die Thread-Synchronisierung für ObservableCollection
. Diese vom UI-Thread aufgerufene Methode behandelt zwei entscheidende Aspekte:
CollectionChanged
Ereignisse an ihn weiter.Kooperatives Sperren: Ein Schlüssel zum Erfolg
Während EnableCollectionSynchronization
eine erhebliche Hilfe bietet, erfordert die Aufrechterhaltung der Thread-Sicherheit Zusammenarbeit. Hintergrundthreads müssen dieselbe Sperre erwerben, die von EnableCollectionSynchronization
verwendet wird, bevor sie ObservableCollection
ändern. Dies gewährleistet einen synchronisierten Zugriff.
Implementierungsschritte
lock
Anweisung oder ein benutzerdefinierter Sperrmechanismus verwendet werden.BindingOperations.EnableCollectionSynchronization
im UI-Thread auf und geben Sie die Sammlung und den von Ihnen gewählten Sperrmechanismus an.ObservableCollection
ändern, und geben Sie sie anschließend frei.Indem Sie diesem kooperativen Sperransatz folgen, können Sie Ihre ObservableCollection
sicher aus Hintergrundthreads aktualisieren, um Thread-Sicherheit zu gewährleisten und eine reibungslose Datenanzeige in Echtzeit in Ihren WPF-Anwendungen zu ermöglichen.
Das obige ist der detaillierte Inhalt vonWie kann ich eine ObservableCollection aus einem Worker-Thread in WPF sicher aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!