WPF實戰案例-在線程內同步集合數據到UI線程

有這樣一個場景,在vm中,咱們爲了ui的體驗,會異步訪問後端接口,獲取數據集合,若是這個集合綁定到界面,而且在線程內,怎麼處理?後端

有人講:this.Dispatcher.Invoke,若是在vm內呢?  有人講:Application.Current.Dispatcher.Invoke異步

每一個集合都包起來?不太舒爽吧。。ide

這裏有個更好的方案介紹給你們,就是SynchronizationContext,同步上下文。ui

基於WPF的ObservableCollection擴展this

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線程處理。spa

歡迎有其餘方案的小夥伴共同交流,頁面下方能夠加入咱們。線程

相關文章
相關標籤/搜索