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