您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页WPF实战案例-在线程内同步集合数据到UI线程

WPF实战案例-在线程内同步集合数据到UI线程

来源:五一七教育网

有这样一个场景,在vm中,我们为了ui的体验,会异步访问后端接口,获取数据集合,如果这个集合绑定到界面,并且在线程内,怎么处理?

有人讲:this.Dispatcher.Invoke,如果在vm内呢?  有人讲:Application.Current.Dispatcher.Invoke

每个集合都包起来?不太舒爽吧。。

这里有个更好的方案介绍给大家,就是SynchronizationContext,同步上下文。

基于WPF的ObservableCollection扩展

public class AsyncObservableCollection<T> : ObservableCollection<T>
    {
        private SynchronizationContext _synchronizationContext = SynchronizationContext.Current;
        public AsyncObservableCollection() { }
        public AsyncObservableCollection(IEnumerable<T> list) : base(list) { }
        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (SynchronizationContext.Current == _synchronizationContext)
            {            
                RaiseCollectionChanged(e);
            }
            else
            {        
                _synchronizationContext.Post(RaiseCollectionChanged, e);
            }
        }
        private void RaiseCollectionChanged(object param)
        {          
            base.OnCollectionChanged((NotifyCollectionChangedEventArgs)param);
        }
        protected override void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (SynchronizationContext.Current == _synchronizationContext)
            {              
                RaisePropertyChanged(e);
            }
            else
            {       
                _synchronizationContext.Post(RaisePropertyChanged, e);
            }
        }
        private void RaisePropertyChanged(object param)
        {         
            base.OnPropertyChanged((PropertyChangedEventArgs)param);
        }
    }

在第一次实例话的时候去记录当前线程上下文,下次不是同一个线程的时候,将集合同步到ui线程处理。

欢迎有其他方案的小伙伴共同交流,页面下方可以加入我们。

转载于:https://www.cnblogs.com/BeiJing-Net-DaiDai/p/11505857.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务