.NET
のスレッドセーフオブザーバブレクトの更新ObservableCollection
オブジェクトとバックグラウンドスレッドを使用すると、UIスレッドの外側で変更が試行された場合、例外につながることがよくあります。 この記事では、その理由について説明し、解決策を提供します
挑戦:単一の読み取り自然
sは本質的にシングルスレッドです。 それらを作成したスレッド(通常はUIスレッド)からのみ変更できます。 ワーカースレッドから更新を試みると、例外が発生します。
.NET 4.5以降のソリューションObservableCollection
.NET 4.5以降のバージョンは、スレッドセーフアクセスに
を提供します。この方法では、同期とディスパッチイベントをUIスレッドに処理します。
BindingOperations.EnableCollectionSynchronization
CollectionChanged
実装の手順:
UIスレッドの
。 2番目の引数はロックオブジェクトです。 を使用すると、単純なロックが作成されます。
BindingOperations.EnableCollectionSynchronization(yourObservableCollection, new object())
new object()
ワーカーのスレッド内:
同じロックオブジェクトを使用してに渡されます。 を変更する前にロックを取得し、その後放出します。 これにより、スレッドの安全性が保証されます
EnableCollectionSynchronization
ObservableCollection
このアプローチは、フレームワークの組み込みの同期を活用して、バックグラウンドスレッドからObservableCollection
sを更新するためのクリーンで効率的なソリューションを提供します。 デッドロックを防ぐために常にロックをリリースすることを忘れないでください
以上が.NETのワーカースレッドからの観測可能な収集を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。