【发布时间】:2011-04-23 10:21:42
【问题描述】:
平台:WPF, .NET 4.0, C# 4.0
问题:在 Mainwindow.xaml 中,我有一个绑定到 Customer 集合的 ListBox,该集合当前是 ObservableCollection。
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
这个集合可以通过多个来源进行更新,例如文件系统、WebService 等。
为了允许并行加载客户,我创建了一个辅助类
public class CustomerManager(ref ObsevableCollection<Customer> cust)
在内部为每个客户源生成一个新任务(来自并行扩展库),并将一个新客户实例添加到客户集合对象(通过 ref 传递给其 ctor)。
问题是 ObservableCollection
“NotSupportedException – 这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。”
我尝试过使用
System.Collections.Concurrent.ConcurrentBag<Customer>
collection 但它没有实现 INotifyCollectionChanged 接口。因此我的 WPF UI 不会自动更新。
那么,是否有一个集合类既可以实现属性/集合更改通知,又允许来自其他非 UI 线程的调用?
根据我最初的 bing/谷歌搜索,没有提供开箱即用的功能。
编辑:我创建了自己的集合,该集合继承自 ConcurrentBag,还实现了 INotifyCollectionChanged 接口。但令我惊讶的是,即使在单独的任务中调用它之后,WPF UI 也会挂起,直到任务完成。 任务不是应该并行执行,不阻塞 UI 线程?
提前感谢您的任何建议。
【问题讨论】:
-
你可以试试this blog post的实现。
-
谢谢。看起来不错。试试看!
-
嗨 Darin,我使用了博文中提到的集合类。正如我的问题中提到的,我能够通过创建自己的集合类继承并实现所需的类/接口来合并并发和通知更改,但是 UI 被阻止了。使用任务的主要原因是具有 UI 响应能力。那还是不行!非常感谢您的建议。
-
对于线程安全的解决方案,请尝试codeproject.com/Articles/64936/…
标签: wpf .net-4.0 c#-4.0 observablecollection task-parallel-library