好吧,假设我有一个我数据绑定的对象,它实现了INotifyPropertyChanged,以便在值发生变化时告诉GUI ...
如果我从与GUI线程不同的线程触发这个,wpf会如何表现?
并确保它从内存中获取属性的值而不是cpu缓存吗?
或多或少地询问wpf是否对包含属性的对象执行lock()...
答案 0 :(得分:40)
INotifyPropertyChanged
触发的值更改会自动编组返回到调度程序。 (http://blog.lab49.com/archives/1166)
在您喜欢的任何主题上触发此事件......
INotifyCollectionChanged
触发的值更改未被可靠地编组到调度程序上。 (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)
如果您需要从其他线程更新可观察集合,请按照此链接中的建议
答案 1 :(得分:3)
除了@Rob Fonseca-Ensor的回答,对于那些有幸使用WPF4.5的人来说,有一些好消息:
WPF使您可以访问和修改除创建集合之外的线程上的数据集合。这使您可以使用后台线程从外部源(如数据库)接收数据,并在UI线程上显示数据。通过使用另一个线程来修改集合,您的用户界面仍然可以响应用户交互。 (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access)
Jonathan Antoine提供了一个有用的摘要:http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/
答案 2 :(得分:0)
在实践中,它似乎按预期工作,似乎是线程安全的(由于在后台线程上更新,没有看到任何奇怪的事件或异常)。我相信它会在需要时调用UI线程,但我不太熟悉内部。