13

私はこの概念を理解するのに苦労しており、多くの実験を行った後でも、WPF の ObservableCollections と BindingOperations.EnableCollectionSynchronization を使用するベスト プラクティスが何であるかをまだ理解できません。

監視可能なコレクションを持つビューモデルがあり、以下に示すようにロックを使用してコレクションの同期を有​​効にするとします。

m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
                                                   m_obsverableCollectionLock);

それは、その監視可能なコレクションに対するすべての変更と列挙が次のようになることを意味しますか?

  1. m_obsverableCollectionLock? を使用してコレクションを自動的にロックしますか?
  2. コレクションが作成されたスレッドですべての変更をマーシャリングしますか?
  3. バインド操作呼び出しが行われたスレッドですべての変更をマーシャリングしますか?

BindingOperations.EnableCollectionSynchronization を使用する場合、何らかの種類のロックを明示的に行う必要がありますか?

このすべてを生み出した問題は、BindingOperations.EnableCollectionSynchronization を使用し、そのメソッドに渡した同じロックを使用してアイテムをロックした後でも、非常にまれに「このタイプの CollectionView は、別のスレッドからのその SourceCollection への変更をサポートしていません。ディスパッチャ スレッド。」例外

4

2 に答える 2

13

ついにその真相にたどり着きました:

ディスパッチャーで CollectionSynchronization を有効にする必要があります。

Application.Current.Dispatcher.BeginInvoke(new Action(()=>
{
    BindingOperations.EnableCollectionSynchronization(m_obsverableCollection, m_observableCollectionLock);
}));

次に、他のスレッドがオブザーバブルにアクセスするたびに、次のように簡単に実行できます。

lock (m_observableCollectionLock)
    m_observableCollection.Add(...)
于 2014-12-15T07:52:16.040 に答える