平台:WPF, .NET 4.0, C# 4.0
.NET 4中是否有Threadsafe Observable集合?
问题:在Mainwindow.xaml我已绑定到客户收集这是目前一个ObservableCollection <顾客>列表框。
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
这个系列可以通过多种来源进行更新,如文件系统,web服务等
,让客户的并行加载我创建了一个辅助类
public class CustomerManager(ref ObsevableCollection<Customer> cust)
那在内部为每个客户Source产生一个新的Task(来自并行扩展库),并向客户集合对象添加一个新的Customer实例(通过re f到它的ctor)。
的问题是,的ObservableCollection < T>(或与此有关的任何集合)不能从除UI线程之外调用中使用,并在遇到异常:
“NotSupportedException异常 - 这种类型的CollectionView不支持从与分派器线程不同的线程更改为其SourceCollection。“
我尝试使用
System.Collections.Concurrent.ConcurrentBag<Customer>
集合,但它亘古不变的实现INotifyCollectionChanged接口。因此我的WPF UI不会自动更新。
那么,是否有一个集合类实现了属性/集合更改通知,并且还允许来自其他非UI线程的调用?
通过我最初的Bing /谷歌搜索,没有提供任何开箱即用。
编辑:我创建了自己的集合,从ConcurrentBag <客户>继承,也实现了INotifyCollectionChanged接口。但令我惊讶的是,即使在单独的任务中调用它之后,WPF UI也会挂起,直到任务完成。 是不是应该并行执行任务,而不是阻止UI线程?
感谢您的任何建议,提前。
您可以尝试在执行[这个博客帖子(http://www.deanchalk.me.uk/post/Thread-Safe-Dispatcher-Safe-Observable-Collection-for-WPF.aspx) 。 – 2010-10-10 10:38:26
谢谢。看起来不错。尝试一下! – Vaibhav 2010-10-10 10:44:32
嗨达林,我使用了博客文章中提到的集合类。正如我的问题所述,我能够通过创建自己的集合类来合并并发和通知更改,继承和实现所需的类/接口,但UI被阻止。 使用任务的主要原因是具有UI响应。 那还不行!非常感谢您的建议。 – Vaibhav 2010-10-10 10:56:13