我正在使用C#/ WPF编写下载管理器,我刚刚遇到了这个错误:
这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。
我的程序的基本流程是一些网页/下载在开始时排队,然后它们被异步下载。当HTML页面完成下载后,我会解析它并查找更多要下载的内容,然后直接从工作线程中对其进行排队。
尝试在我的自定义队列类中发送CollectionChanged
事件时出现错误。但是,我需要触发该事件,以便GUI可以更新。
我有什么选择?
答案 0 :(得分:2)
您可能想要查看来自Microsoft的Reactive Extensions,它们是专为此类设计的。它们创建了“可观察的集合”,在并行和多核场景中非常有用。
<强>更新强>
您也可能会发现SyncronizationContext也很有用。这是Windows Forms示例,但WPF也有变体。
答案 1 :(得分:1)
您只需要确保使用相关线程的Dispatcher来调用更新集合的任何代码,或者触发事件。
http://msdn.microsoft.com/en-us/magazine/cc163328.aspx
<强>更新强>
Dispatcher是派生自DispatcherObject的所有类的属性,包括所有DependencyObjects,Visuals等。
因此,您的GUI对象都将具有Dispatcher属性。
答案 2 :(得分:1)
每当我不得不处理跨线程的收集更改通知时,我总是转向How can I propagate changes across threads博客文章寻求帮助。
我不确定你的问题是否确实可以帮助你,但如果你的收藏是你直接控制的,你可以从中受益。