有這樣一個場景,在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
歡迎有其餘方案的小夥伴共同交流,頁面下方能夠加入咱們。線程