2010-03-31 98 views
23

好讓說,我有我的數據綁定到一個對象,它實現INotifyPropertyChanged告訴GUI當值發生了變化......WPF數據綁定線程安全性?

如果我觸發此從不同的線程比GUI線程會如何表現WPF?

它會確保它從內存獲取屬性的值而不是cpu緩存?

或多或少IM詢問是否WPF不包含屬性的對象鎖()...

回答

38

INotifyPropertyChanged發起的值更改被自動整理回回到調度程序。 (http://blog.lab49.com/archives/1166

火上你喜歡的任何線程本次活動由... INotifyCollectionChanged發射


價值變化並不可靠編組到調度員。 (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/

如果您需要從不同的線程更新可觀察集合,照做,在這個環節上

+0

+1哈!每天學習新事物。只是做了一個快速測試,以確認這一點....我相信我不得不向UI線程marshall值使用wpf時......也許我只是要老去...... – ozczecho 2010-03-31 14:06:03

+1

你肯定要編組任何調用實際控制('textBox.Text =「Foo」)',但數據綁定框架有所幫助。 – 2010-03-31 14:08:55

+0

如果我向該屬性使用的私有變量寫入一個值然後觸發該事件,那麼「GUI」線程會讀取該值,但它具有緩存在CPU緩存中的舊值......如果存在任何handeling這可以確保該值不舊或緩存?... – Peter 2010-03-31 16:30:31

0

在實踐中似乎按預期方式工作,似乎是線程安全的(還沒有看到什麼奇怪由於在後臺線程上更新而發生或異常)。我相信它會在需要時調用UI線程,但我不太熟悉內部。

2

除了@Rob豐塞卡 - 恩索的回答,對於那些幸運地一些好消息使用WPF4.5:

WPF使您能夠訪問和修改創建集合之外的線程上的數據集合。這使您可以使用後臺線程從外部源(例如數據庫)接收數據,並在UI線程上顯示數據。通過使用另一個線程來修改集合,您的用戶界面將保持對用戶交互的響應。 (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access

有一個有用的摘要喬納森·安東尼:http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/