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 的所有修改都委托给 UI 线程,从而解决异常。
以上是如何从 WPF 应用程序中的不同线程修改 ObservableCollection,而不违反调度程序线程关联性?的详细内容。更多信息请关注PHP中文网其他相关文章!