2011-09-08 72 views
2

我有一個TextBox綁定到一個屬性,後者在後臺線程中以非常快的速度被修改。 WPF線程中的數據綁定是否安全?屬性或文本框中的數據會不會同步?是否有必要(甚至可能)在參與數據綁定的屬性上使用同步?WPF DataBinding線程安全

我明白,如果屬性所在的類實現INotifyPropertyChanged,則綁定框架會自動將UI更新封送到UI線程。但是,這不會讓數據不同步嗎?如果我理解正確,從一個線程寫入並從另一個線程讀取的變量應該通過同步...數據綁定是一個異常?

謝謝!!

回答

4

是,在大多數情況下。綁定對於單個對象是線程安全的(所以應該對你的字符串適用)。然而,綁定到一個集合是而不是線程安全 - 仍然需要手動編組。如果您有一個綁定到集合的控件,則無法在後臺線程上更改該集合。

我明白,如果屬性所在的類實現了INotifyPropertyChanged,則綁定框架會自動將UI更新封送到UI線程。但是,這不會讓數據不同步嗎?

這不應該不同步的,除非多個線程很快寫入變量(在這種情況下,他們將所有的塊,直到他們回來同步,但有一段時間,其中線程將在用戶界面上「等待」)。編組發生同步,因此線程在綁定更新之前不會接收值。這可能會減慢處理速度,因爲UI更新必須在後臺線程可以繼續之前發生。

+0

謝謝,你和克里斯都得到了答案。我沒有意識到編組是同步發生的。 –

2

是的,它通常是線程安全的。在WPF中(與WinForms不同),數據綁定類查找UI線程的Dispatcher並使用它(如果需要)自動封送到UI線程。但是,請注意,這是同步完成的 - 當UI重新繪製時,後臺線程將會阻塞,並且我已經看到由於快速後臺更新導致波動,「凍結」以及其他意想不到的效果。

看到類似的問題在這裏:WPF Databinding thread safety?