在WPF中,我们有两个线程(至少):呈现和UI线程。当我在某些属性更改时引发事件OnNotifyPropertyChanged时,它会在UI线程上引发。需要将此信息分派到WPF呈现线程以进行重新呈现。我假设它以同步方式完成(Dispatcher.Invoke),但它是如何工作的?
如果我为相同的数据结构引发了多个OnNotifyPropertyChanged事件而没有锁定对这些事件已经引发的数据结构的访问者属性的访问权限,那么我是否创建了潜在的竞争条件?我已经看到臭名昭着的“集合被修改;枚举操作可能无法执行”来自WPF的异常,所以它看起来像WPF异步处理这些事件。我误解了这个例外吗?谢谢!
答案 0 :(得分:1)
异常“集合已修改;枚举操作可能无法执行”与WPF无关,当您使用foreach迭代集合时会从IEnumerator引发异常,并且在执行此操作时集合以某种方式更改(添加/删除/修改)。 (例如:http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/)
除此之外,我从未遇到过因PropertyChanged事件多次同时调用而导致的异常。
答案 1 :(得分:0)
希望当你引用两个主题时,你正在引用
是的,你是对的,更新是ASYNCH
答案 2 :(得分:0)
你是否在非UI线程上处理你的自我?我非常肯定您绑定的任何枚举的迭代都将在UI线程上完成,因此如果在您举起事件后,应用程序中的其他人修改了集合,您将获得此异常。
问题不应该是由渲染线程迭代你的集合引起的,因为它从来没有这样做。