WPF数据绑定线程安全吗?

时间:2010-03-31 13:36:14

标签: wpf multithreading data-binding

好吧,假设我有一个我数据绑定的对象,它实现了INotifyPropertyChanged,以便在值发生变化时告诉GUI ...

如果我从与GUI线程不同的线程触发这个,wpf会如何表现?

并确保它从内存中获取属性的值而不是cpu缓存吗?

或多或少地询问wpf是否对包含属性的对象执行lock()...

3 个答案:

答案 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线程,但我不太熟悉内部。