ホームページ  >  記事  >  バックエンド開発  >  ディスパッチャ スレッド アフィニティ違反を発生させずに、WPF アプリケーションの別のスレッドから ObservableCollection を変更するにはどうすればよいですか?

ディスパッチャ スレッド アフィニティ違反を発生させずに、WPF アプリケーションの別のスレッドから ObservableCollection を変更するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-30 15:20:51381ブラウズ

How Can I Modify an ObservableCollection from a Different Thread in a WPF Application Without a Dispatcher Thread Affinity Violation?

ObservableCollection の変更によるディスパッチャー スレッド アフィニティ違反

WPF アプリケーションでは、DataGrid を含む特定の種類のコレクションをディスパッチャーから変更する必要があります糸。これは、これらのコレクションは UI スレッドとの親和性を維持しており、別のスレッドからコレクションを変更しようとすると、「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」のような例外が発生する可能性があるためです。 🎜>

提供されたコードでは、MainWindowViewModel の ObservableCollection _matchObsCollection が UI スレッド上に作成されます。ただし、このコレクションを変更する Load() メソッドは非同期的に呼び出されます。 UI スレッド以外のスレッドから変更が試行されるため、例外が発生します。

解決策:

この問題を解決するには、_matchObsCollection への変更を実行する必要があります。ディスパッチャースレッドで。これは、Dispatcher.Invoke() メソッドを使用して変更を UI スレッドに委任することで実現できます。

これは、Dispatcher.Invoke() を使用して ObservableCollection を変更する Load() メソッドの修正バージョンです。 UI スレッド上:

public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}
この変更されたコードにより、_matchObsCollection へのすべての変更が UI スレッドに確実に委任され、例外が解決されます。

以上がディスパッチャ スレッド アフィニティ違反を発生させずに、WPF アプリケーションの別のスレッドから ObservableCollection を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。