首页 > 后端开发 > C++ > 如何从 WPF 应用程序中的不同线程修改 ObservableCollection,而不违反调度程序线程关联性?

如何从 WPF 应用程序中的不同线程修改 ObservableCollection,而不违反调度程序线程关联性?

DDD
发布: 2024-10-30 15:20:51
原创
463 人浏览过

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 的所有修改都委托给 UI 线程,从而解决异常。

以上是如何从 WPF 应用程序中的不同线程修改 ObservableCollection,而不违反调度程序线程关联性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板