在其他线程更新 ObservableCollection 抛出异常System.NotSupportedException

           在使用WPF时,为与前台UI绑定数据,经常使用ObservableCollection ,然而当我们希望在后台线程更新ObservableCollection ,从而使前台实时显示时,会抛出System.NotSupportedException,导致UI crossthreading exception.

 

        可以重载ObservableCollection<T>OnCollectionChanged 方法,如下可以解决此问题:

 

public class MTObservableCollection<T> : ObservableCollection<T> 
{ 
   
public override event NotifyCollectionChangedEventHandler CollectionChanged; 
   
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
   
{ 
     
var eh = CollectionChanged; 
     
if (eh != null) 
     
{ 
         
Dispatcher dispatcher = (from NotifyCollectionChangedEventHandler nh in eh.GetInvocationList() 
                 let dpo
= nh.Target as DispatcherObject 
                 where dpo
!= null 
                 
select dpo.Dispatcher).FirstOrDefault(); 
 
       
if (dispatcher != null && dispatcher.CheckAccess() == false) 
       
{ 
           dispatcher
.Invoke(DispatcherPriority.DataBind, (Action)(() => OnCollectionChanged(e))); 
       
} 
       
else 
       
{ 
           
foreach (NotifyCollectionChangedEventHandler nh in eh.GetInvocationList()) 
              nh
.Invoke(this, e); 
       
} 
     
} 
 
} 
} 

备注:

System.NotSupportedException : This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值