Mono System.Collections.ObjectModel.ObservableCollection<T>
が「スレッドセーフではない」というドキュメントや他の場所があります。私は、アプリケーションが同時に複数のスレッドからAdd()
のようなメソッドを呼び出さないようにすべきだということを理解しています。しかし、これは、Viewsのようなスレッドアフィニティを持つことを意味するのではないかと私は不思議です。Mono ObservableCollectionにスレッド親和性がありますか?
WPFは長年前に仕事をしていましたが、WPFでスレッドアフィニティを持っていたことを覚えています。イベントを発生させずに特定の例外をスローしています。しかし、バインディングを更新したときにXamarin Formsが自動的にVMプロパティの変更をUIスレッドに転送するように見えていますが、WPFがそうしたとは思いません。
したがって、例Xamarin.Formsプロジェクトを設定し、ListView
をObservableCollection
にバインドしました。 UIスレッドにいくつかの項目を追加するコードとワーカースレッドに追加するコードを書きました。比較のために、私はワーカースレッドからLabelのテキストを設定するメソッドも書きました。 ObservableCollectionの作業を更新するための両方の方法。ラベルを更新するボタンをタップすると、アプリケーションがクラッシュします。
と表示されます。はスレッドアフィニティがないことを証明し、Xamarinフォームバインディングは正しいスレッドでイベントを処理します。しかし、私は親和性の問題を予測できないものにするためにも使用されているので、私はちょうど "幸運になる"ことができます。
明確な回答はありますか?別の同期の問題があるのであれば、スレッドからバインドされたObservableCollectionを更新できますか?