2010-08-06 88 views
0

我有一個綁定到集合的WPF ListView(List<T>)。它目前從當前正常工作的線程更新。線程安全,列表,綁定和WPF

我想將更新列表的邏輯移動到一個線程中,並且我看到一些關於線程安全性和列表綁定的潛在問題。我可以保證,除非我致電NotifyPropertyChanged,否則綁定不會更新?是NotifyPropertyChanged阻塞呼叫還是隻是將它添加到消息隊列中;在這種情況下,肯定可能有一種情況,我告訴ListView集合已更新,但到更新綁定時,我可能正在修改其他線程中的集合,這將引發異常或程序崩潰。

在這種情況下實現線程安全的最佳方法是什麼?

回答

1

INotifyPropertyChanged的不是線程安全的,並且它阻塞調用線程。

最好?這是個好問題。我不知道。底線是,在某個時候,調用必須被整理到UI線程中。你什麼時候這樣做?

您可以1)準備好所有內容,然後將其發送到UI更新的UI線程。或者,您可以2)實現INotifyPropertyChanged,並使該事件的觸發始終發生在UI線程上,或3)您可以執行許多不同的事情之一。

但是,通常情況下,您希望更新UI一次全部發生(例如,一次不會發生一次,例如將單個項添加到ObservableCollection時)。因此,建立一些實現INotifyProperty和CollectionChanged的線程安全基類並使用它們可能是明智的。

不幸的是,框架中沒有任何東西可以爲你做到這一點。

1

您可以從Dispatcher.Invoke收集更新,以避免這些線程問題:

void ThreadProc() 
{ 
    window.Dispatcher.Invoke(() => { 
     //UpdateList 
    }); 
} 
+0

雖然Invoke不是阻塞呼叫嗎?當然,可以在列表被修改的同時更新綁定。 – Chris 2010-08-06 11:25:03

+0

@Chris它是同步的,但您始終可以調用Begin/EndInvoke。 – Will 2010-08-06 11:26:59