ホームページ > バックエンド開発 > C++ > WPF で ObservableCollections のスレッドセーフな変更を確実に行うにはどうすればよいですか?

WPF で ObservableCollections のスレッドセーフな変更を確実に行うにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-26 22:41:11
オリジナル
497 人が閲覧しました

How to Ensure Thread-Safe Modifications of ObservableCollections in WPF?

WPF での ObservableCollection のスレッドセーフな変更

WPF で ObservableCollection を使用する場合、スレッドの安全性を維持することが重要です。適切な同期を行わずにワーカー スレッドから ObservableCollection を変更しようとすると、例外が発生します。

ワーカー スレッドから ObservableCollection を変更するには、UI スレッド メソッドを BindingOperations.EnableCollectionSynchronization 使用する必要があります。このメソッドは次の手順を実行します:

  1. CollectionChanged イベントのマーシャリング: これは、UI スレッドを CollectionChanged イベントのディスパッチャーとして指定し、イベントが UI スレッドで処理されるようにします。
  2. 変更中にコレクションをロックする: マーシャリングされたイベントが処理されるまで、コレクションのロックを取得します。これにより、ワーカー スレッドがコレクションを変更している間、UI スレッド イベント ハンドラーがコレクションにアクセスできなくなります。

スレッドセーフなコレクションを正しく処理する手順:

  1. ロック メカニズムの選択: 従来の lock ステートメントを使用するか、カスタム同期メカニズムを使用するかを決定します。
  2. 同期を有効にする: UI スレッドで、選択したロック メカニズムに基づいて EnableCollectionSynchronization の適切なオーバーロードを呼び出します。
  3. 変更前にロックを取得: ワーカー スレッドで、同じメカニズムを使用して、変更を行う前にコレクションをロックします。

lock ステートメントの使用例:

<code class="language-csharp">public class ViewModel
{
    private readonly ObservableCollection<Item> _items;

    public ViewModel()
    {
        _items = new ObservableCollection<Item>();
        BindingOperations.EnableCollectionSynchronization(_items, new object());
    }

    public void UpdateCollection()
    {
        var worker = new Thread(() =>
        {
            lock (_items)
            {
                _items.Add(new Item());
            }
        });
        worker.Start();
    }
}</code>
ログイン後にコピー

これらの手順を実装すると、データの整合性に影響を与えることなく、ワーカー スレッドから ObservableCollection を安全に更新できます。

以上がWPF で ObservableCollections のスレッドセーフな変更を確実に行うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート