C#/WPF DataGrid綁定的集合操作, 跨線程, 如何解決耦合度問題?

我現在遇到一個棘手的問題, 一個DataGrid, 綁定到ObservableCollection, 由於是從另一個線程操作(這個線程由一個類庫中的一個類發起)增刪, 所以就引發了錯誤, 解決方法就是用DataGrid的Dispatcher(調度器), 但是如果要把所有Add,Remove都套上一個委託, 就不得不修改這個類庫, 並大大增加和耦合度, 我應該怎麼辦?


這個我最近正好遇到了

如果你是 .net 4.5 及以上,參考 BindingOperations.EnableCollectionSynchronization Method (System.Windows.Data) automatically synchronize access to the collection and dispatch CollectionChanged events to the UI thread

如果和我一樣在 4.5 以下,考慮到處 BeginInvoke 也挺難看的,而且將來不好改,我用的方法是封裝一個 AsyncObservableCollection& : ObservableCollection&,然後 override OnCollectionChanged 等三個方法。不需要給 Add Remove 之類的全加一遍的。

WPF 要做 MVVM,為了減少複製粘貼代碼,要麼用一些 MVVMLight 之類的框架,要麼就要自己封裝一些東西。

比如 INPC 弄一個簡單的 ObservableObject : INPC,裡面簡單寫幾行 RaisePropertyChanged,或者用 Fody 的 PropertyChanged (這個是看起來最簡潔的),或者用 Resharper 提供的自動生成 PropertyChanged 代碼。

比如再弄一個 ViewModel& : ObservableObject 。。。


GUI是不能跨線程調用的,該有的耦合就得有。這個時候你要把耦合全部集中在你那個帶有委託的Add和Remove的奇怪的類上面,這樣耦合的地方就是可以控制的,於是這種耦合也沒有問題。


獲取UI線程調度器不一定非要通過具體的DataGrid控制項,可以這樣:

Application.Current.MainWindow.Dispatcher.BeginInvoke()

這樣就不耦合了。如果用的很多可以把UI線程調度器保存在一個靜態變數里,需要的時候直接用。


少年,你需要一斤&<&<設計模式&>&>。


在 via C# 有一個通用的方法,可以處理不同的桌麵線程模型,我沒有好好掌握,還是在使用invoke 方式,或者用 Dispatcher 屬性。你可以 看看這個 via C# 線程這章


zmq是很好的選擇


推薦閱讀:

精通面向對象編程,是怎樣一種體驗?
很有經驗的面向對象開發者也會有這種感覺嗎?
怎麼樣知道自己有沒有掌握面向對象編程的思想?
Haskell中的class和其它語言(如Rust)中的Trait的區別和聯繫?
面向對象的RAII怎麼處理阻塞型的資源獲取過程?

TAG:面向對象編程 | C# | WindowsPresentationFoundationWPF |