首頁  >  文章  >  後端開發  >  為什麼我收到'這種類型的 CollectionView 不支援從與 Dispatcher 線程不同的線程更改其 SourceCollection”?

為什麼我收到'這種類型的 CollectionView 不支援從與 Dispatcher 線程不同的線程更改其 SourceCollection”?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 21:45:30670瀏覽

Why Am I Getting

錯誤處理:「這種類型的CollectionView 不支援從與Dispatcher 執行緒不同的執行緒更改其SourceCollection」

給定的錯誤訊息,「這種類型CollectionView 不支援從與Dispatcher 執行緒不同的執行緒變更其SourceCollection”,表示嘗試從非UI 執行緒修改ObservableCollection。

如提供的程式碼所述,ViewModel 的 Load( ) 方法從 GetMatchDetailsDC 物件清單填入 _matchObsCollection ObservableCollection。但是,此更新是在 UI 執行緒之外執行的。

執行緒關聯性和調度程序

在 WPF 中,UI 元素(例如 DataGrid)是在 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 元素時,考慮執行緒安全非常重要。請務必確保對 UI 元素的任何更新(例如修改 ObservableCollection)都在 UI 執行緒上執行,以避免與執行緒相關的錯誤。

以上是為什麼我收到'這種類型的 CollectionView 不支援從與 Dispatcher 線程不同的線程更改其 SourceCollection”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn