C# CollectionChanged跨线程通知?

C# CollectionChanged跨线程通知?,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在使用C#/WPF编写下载管理器,刚刚遇到以下错误: 此类型的CollectionView不支持从不同于Dispatcher线程的线程更改其SourceCollection 我的程序的基本流程是,一些网页/下载在开始时排队,然后异步下载。当一个HTML页面完成下载后,我解析它并寻找更多要下载的内容,然后直接从工作线程中将其排队 我在尝试发送自定义队列类上的CollectionChanged事件时遇到该错误。但是,我需要触发该事件,以便GUI可以得到更新 我的选项是什么?您只需要确保使用相关线

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

此类型的CollectionView不支持从不同于Dispatcher线程的线程更改其SourceCollection

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

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


我的选项是什么?

您只需要确保使用相关线程的Dispatcher来调用更新集合或触发事件的任何代码

更新

Dispatcher是从DispatcherObject派生的所有类的属性,包括所有DependencyObject、可视对象等


因此,您的GUI对象都将有一个Dispatcher属性。

您可能需要查看来自Microsoft的,它们正是为这类事情而设计的。它们创建“可观察的集合”,在并行和多核场景中非常有用

更新:


你可能也会发现这些方法很有用。这是一个Windows窗体示例,但WPF也有一些变体。

每当我必须处理跨线程的集合更改通知时,我总是求助于博客文章


从你问题的上下文来看,我不确定这是否真的能帮助你,但如果你的收藏是你直接控制的,你可以从中受益。

在那篇文章中,他们写了Dispatcher.Invoke(DispatcherPriority.Normal,newaction(SetStatus),“fromother Thread”);看起来这可能是我排队需要做的。但是这个
Dispatcher
是在哪里定义的呢?它是如何知道要与哪个线程同步的呢?嗯……在崩溃之前,它会走得更远一些。原来我的
DownloadManager
本身有一些跨线程排队,但它是通过XAML创建的,我无法从它内部访问调度程序。不太确定现在该做什么。实际上,如果我从DispatcherObject派生,然后将
私有Dispatcher=Dispatcher.CurrentDispatcher在我的类中,并使用它在崩溃之前运行10秒,w/out异常或堆栈跟踪!万岁!请尝试DispatcherPriority。背景或其他较低优先级。不,我确信我的代码中存在问题。。。我不希望它的优先级降低。这是一个重要的手术:)看起来很有趣。。。但我不知道如何使用它,而且除了一些视频之外,似乎没有任何文档可以直接解决我的问题。从我所掌握的,我应该基本上把一个可枚举的转换成一个可观察的。。。但我真的不知道这是怎么回事。当一个项被更改/删除时,可观察项应该触发事件,但可枚举项不这样做。。。收藏。Rx如何足够聪明,知道如何触发适当的事件呢?让我困惑。请参阅:和:未解释如何从集合中取出元素:(我重新阅读了你的问题,我不确定你的排队问题到底是什么。你能更详细地解释一下吗?问题是,在那篇博文中,她只介绍了返回
void
BeginInvoke
的方法,但当你实际需要返回值时,这些方法效果不太好。