从CollectionViewProxy(内部WPF类型)引发的间歇性异常

时间:2019-06-24 14:55:26

标签: c# wpf multithreading

有问题的异常是程序从另一个线程修改集合时通常会看到的异常:

  

System.NotSupportedException:这种类型的CollectionView不支持从与Dispatcher线程不同的线程对其SourceCollection进行更改。

但这不是将修改推送到主线程上的情况。 有问题的CollectionView是我自己的作品之一,它确实支持跨线程更改。

调查之后,我发现该异常实际上是由CollectionViewProxy对象引发的,其中一个对象是WPF在内部创建的,用于包装我的收藏夹视图。

此类型的构造函数将名为ShouldProcessCollectionChanged的标志设置为false,以防止自身处理集合更改的事件(在OnCollectionChanged中)。 99%的时间可以正常工作,但是即使代理设置了该标志,该检查还是偶尔会通过(当崩溃发生时,标志为IsDynamic | NeedsRefresh)。当检查通过时,总是会引发异常。

以前有人看过吗?我所能想到的是,在一个线程正在更改代理的标志(也许是NeedsRefresh)而另一线程正在读取它们的情况下,则发生了某种竞争。但是integer operations are meant to be atomic in .Net,如果出了错,那肯定也会在其他地方引起问题。

0 个答案:

没有答案