「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」というメッセージが表示されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-01 21:45:30
オリジナル
664 人が閲覧しました

Why Am I Getting

エラー処理: 「このタイプの CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」

指定されたエラー メッセージ、「このタイプCollectionView の は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」は、非 UI スレッドから ObservableCollection を変更しようとする試みを示します。

提供されたコードで説明されているように、ViewModel の Load( ) メソッドは、GetMatchDetailsDC オブジェクトのリストから _matchObsCollection ObservableCollection を設定します。ただし、この更新は UI スレッドの外部で実行されます。

スレッド アフィニティとディスパッチャー

WPF では、DataGrid などの UI 要素は UI スレッド上に作成され、スレッドの親和性。これらの要素に対する変更は、スレッドの安全性を確保するために UI スレッドから実行する必要があります。

エラーの解決

この問題を解決するには、App.Current.Dispatcher.Invoke(( Action)delegate { ... }) UI スレッドでコレクションの更新を呼び出すメソッド:

<code class="csharp">matchList = proxy.GetMatch().ToList();

foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
{
    App.Current.Dispatcher.Invoke((Action)delegate  // <-- Here
    {
        _matchObsCollection.Add(match);
    });
}</code>
ログイン後にコピー

WPF での非同期データの読み込み

データの読み込みには非同期メソッドを使用するのが一般的ですが、非 UI スレッドから UI 要素を操作するときは、スレッドの安全性を考慮することが重要です。スレッド関連のエラーを回避するために、ObservableCollection の変更など、UI 要素の更新は必ず UI スレッドで実行されるようにしてください。

以上が「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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