跨线程的CollectionChanged通知?

时间:2010-05-07 03:19:06

标签: c# wpf multithreading

我正在使用C#/ WPF编写下载管理器,我刚刚遇到了这个错误:

  

这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。

我的程序的基本流程是一些网页/下载在开始时排队,然后它们被异步下载。当HTML页面完成下载后,我会解析它并查找更多要下载的内容,然后直接从工作线程中对其进行排队。

尝试在我的自定义队列类中发送CollectionChanged事件时出现错误。但是,我需要触发该事件,以便GUI可以更新。

我有什么选择?

3 个答案:

答案 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博客文章寻求帮助。

我不确定你的问题是否确实可以帮助你,但如果你的收藏是你直接控制的,你可以从中受益。