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中文網其他相關文章!