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