有问题的异常是程序从另一个线程修改集合时通常会看到的异常:
System.NotSupportedException:这种类型的CollectionView不支持从与Dispatcher线程不同的线程对其SourceCollection进行更改。
但这不是将修改推送到主线程上的情况。 有问题的CollectionView是我自己的作品之一,它确实支持跨线程更改。
调查之后,我发现该异常实际上是由CollectionViewProxy
对象引发的,其中一个对象是WPF在内部创建的,用于包装我的收藏夹视图。
此类型的构造函数将名为ShouldProcessCollectionChanged
的标志设置为false,以防止自身处理集合更改的事件(在OnCollectionChanged
中)。 99%的时间可以正常工作,但是即使代理否设置了该标志,该检查还是偶尔会通过(当崩溃发生时,标志为IsDynamic | NeedsRefresh
)。当检查通过时,总是会引发异常。
以前有人看过吗?我所能想到的是,在一个线程正在更改代理的标志(也许是NeedsRefresh
)而另一线程正在读取它们的情况下,则发生了某种竞争。但是integer operations are meant to be atomic in .Net,如果出了错,那肯定也会在其他地方引起问题。