2016-10-13 10 views
0

Ich sehe in der Dokumentation und an einigen anderen Stellen, dass das Mono System.Collections.ObjectModel.ObservableCollection<T> "nicht thread-safe" ist. Ich verstehe, dass bedeutet, ich sollte nicht zulassen, dass meine Anwendung Methoden wie Add() von mehreren Threads gleichzeitig aufrufen. Aber ich bin neugierig, ob dies bedeutet Threadaffinität, wie Ansichten.Hat Mono ObservableCollection eine Thread-Affinität?

Ich habe WPF vor langer Zeit gearbeitet, und ich erinnere mich, dass es Thread-Affinität in WPF hatte und so weit gegangen ist, eine bestimmte Ausnahme zu werfen, ohne so weit zu gehen, sein Ereignis zu erhöhen. Aber ich habe auch bemerkt, dass Xamarin Forms automatisch Änderungen der VM-Eigenschaften in den UI-Thread überträgt, wenn ich Bindungen aktualisiere, und ich glaube nicht, dass WPF dies getan hat.

Also habe ich ein Beispiel Xamarin.Forms-Projekt eingerichtet und eine ListView an eine ObservableCollection gebunden. Ich habe Code geschrieben, um einige Elemente im UI-Thread hinzuzufügen, und Code, um sie einem Worker-Thread hinzuzufügen. Zum Vergleich habe ich auch eine Methode geschrieben, die den Text eines Labels aus einem Worker-Thread erstellt. Beide Möglichkeiten zum Aktualisieren der ObservableCollection-Funktion. Durch Antippen der Schaltfläche, die das Label aktualisiert, stürzt die Anwendung ab.

Das würde scheinen zu beweisen, gibt es keine Thread-Affinität, und dass Xamarin Forms Bindung behandelt das Ereignis auf den richtigen Thread. Aber ich bin es auch gewöhnt, Affinitätsprobleme etwas unvorhersehbar zu machen, so dass ich einfach "Glück haben" kann.

Gibt es eine definitive Antwort? Kann ich eine gebundene ObservableCollection aus einem beliebigen Thread aktualisieren, solange ich auf das separate Synchronisierungsproblem achten muss?

Antwort

0

Mono ObservableCollection ist nicht threadsicher, hat aber keine Threadaffinität und sollte nicht abstürzen, wenn nicht gleichzeitig von verschiedenen Threads zugegriffen wird.

Verwandte Themen