Thread-sichere ObservableCollection-Updates in .NET
Das Arbeiten mit ObservableCollection
Objekten und Hintergrundthreads führt oft zu Ausnahmen, wenn Änderungen außerhalb des UI-Threads versucht werden. Dieser Artikel erklärt warum und bietet eine Lösung.
Die Herausforderung: Single-Threaded-Natur
ObservableCollection
s sind von Natur aus Single-Threaded. Sie können nur von dem Thread aus geändert werden, der sie erstellt hat (normalerweise der UI-Thread). Der Versuch, Aktualisierungen von einem Arbeitsthread aus durchzuführen, führt zu einer Ausnahme.
Lösung für .NET 4.5 und höher
.NET 4.5 und spätere Versionen bieten BindingOperations.EnableCollectionSynchronization
für threadsicheren Zugriff. Diese Methode übernimmt die Synchronisierung und sendet CollectionChanged
Ereignisse an den UI-Thread.
Implementierungsschritte:
Im UI-Thread: Rufen Sie BindingOperations.EnableCollectionSynchronization(yourObservableCollection, new object())
auf. Das zweite Argument ist ein Sperrobjekt; Durch die Verwendung von new object()
wird eine einfache Sperre erstellt.
Im Arbeitsthread: Verwenden Sie das gleiche Sperrobjekt, das an EnableCollectionSynchronization
übergeben wurde. Erwerben Sie die Sperre, bevor Sie das ObservableCollection
ändern, und geben Sie sie anschließend frei. Dadurch wird die Thread-Sicherheit gewährleistet.
Aktualisierungen durchführen: Nehmen Sie Ihre Änderungen am ObservableCollection
vor, während die Sperre gehalten wird.
Dieser Ansatz nutzt die integrierte Synchronisierung des Frameworks und bietet eine saubere und effiziente Lösung für die Aktualisierung ObservableCollection
s aus Hintergrundthreads. Denken Sie daran, die Sperre immer aufzuheben, um Deadlocks zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine Beobachtung von einem Worker -Thread in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!