私はこの概念を理解するのに苦労しています。多くの実験の後でさえ、WPFでObservableCollectionsを使用し、BindingOperations.EnableCollectionSynchronizationを使用してベストプラクティスが何であるか把握できません。WPFのBindingOperations.EnableCollectionSynchronizationミステリー
私が観察コレクションとのviewmodelを持っており、以下に示すように、私はロックを使用して、その上にコレクションの同期を有効にする場合:
m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
m_obsverableCollectionLock);
それはその観測可能なコレクションのすべての変更と列挙がなることを意味しています:
- m_obsverableCollectionLockを使用して自動的にコレクションをロックしますか?
- コレクションが作成されたスレッドのすべての変更をマーシャルしますか?
- バインディング操作が呼び出されたスレッドのすべての変更をマーシャルしましたか?
BindingOperations.EnableCollectionSynchronizationを使用する場合、明示的にロックする必要がありますか?
BindingOperations.EnableCollectionSynchronizationを使用し、同じロックを使用してアイテムをロックした後でも、そのメソッドに渡されました。非常に時々、私はを取得します。 "このタイプのCollectionViewは、SourceCollectionの変更をサポートしていませんDispatcherスレッドとは異なるスレッドです。例外
コレクションをどのように変更しようとしているか、どこからどこにコードを投稿することができますか?私は小さなアプリでそれを試して、それは私のために完全に動作します。 –
問題が断続的であったため、コードを再現するための追加ができませんでした。問題は、BindingOperations.EnableSynchronizationをUIスレッド経由で行う必要があることです。そうでなければ、コレクションに非UIスレッド経由でアクセスすると例外がスローされる可能性があります – Ruskin
メインUIスレッドまたはバックグラウンドスレッドでObservableCollectionを更新していますか? bgスレッドからの場合は、 'Application.Current.Dispatcher.BeginInvoke()'への呼び出しを使って更新していますか?あなたは単純な 'lock()'ステートメント(〜sanity)を使ってこの呼び出しを試みましたか? – code4life