首頁  >  文章  >  後端開發  >  如何從 WPF 應用程式中的不同執行緒修改 ObservableCollection,而不違反調度程序執行緒關聯性?

如何從 WPF 應用程式中的不同執行緒修改 ObservableCollection,而不違反調度程序執行緒關聯性?

DDD
DDD原創
2024-10-30 15:20:51442瀏覽

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 不支援從與Dispatcher 執行緒不同的執行緒更改其SourceCollection。」

在提供的程式碼中,MainWindowViewModel 中的ObservableCollection _matchObsCollection 是在UI 執行緒上建立的。但是,修改此集合的 Load() 方法是非同步呼叫的。這會導致異常,因為嘗試從 UI 執行緒以外的執行緒進行修改。

解決方案:

要解決此問題,必須對 _matchObsCollection 執行任何修改在調度程式執行緒上。這可以透過使用 Dispatcher.Invoke() 方法將修改委託給 UI 執行緒來實現。

這裡是Load() 方法的修改版本,它使用Dispatcher.Invoke() 來修改ObservableCollection在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_matchObsCollection的所有修改都委託給UI 線程,從而解決異常。

以上是如何從 WPF 應用程式中的不同執行緒修改 ObservableCollection,而不違反調度程序執行緒關聯性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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