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

DDD
リリース: 2024-10-30 15:20:51
オリジナル
392 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!