平台:WPF,.NET 4.0,C# 4.0
问题:在MainWindow.xaml中,我有一个ListBox绑定到一个客户集合,该集合当前是ObservableCollection<Customer>。
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
可以通过多个来源(例如FileSystem,WebService等)更新此集合。
为了允许并行加载客户,我创建了一个帮助类
public class CustomerManager(ref ObsevableCollection<Customer> cust)
它在内部为每个客户源生成新任务(来自Parallel扩展库),并将新的Customer实例添加到传递给其构造函数的cust客户集合对象(按引用传递)。
问题是ObservableCollection<T>(或任何集合)不能从除UI线程以外的调用中使用,并且会遇到异常:
"NotSupportedException-此类型的CollectionView不支持对其SourceCollection所做的更改来自于Dispatcher线程之外的线程."
我尝试使用
System.Collections.Concurrent.ConcurrentBag<Customer>
但是它没有实现INotifyCollectionChanged接口。因此,我的WPF UI将不会自动更新。
那么,是否有一种集合类既实现属性/集合更改通知,又允许从其他非UI线程调用?
根据我的Bing / Googling的初步结果,没有提供开箱即用的集合。
编辑:我创建了自己的集合,该集合继承自ConcurrentBag<Customer>并实现了INotifyCollectionChanged接口。但是令我惊讶的是,即使在单独的任务中调用它,WPF UI也会挂起,直到任务完成。 任务不应该并行执行而不阻塞UI线程吗?
提前感谢任何建议。