C#/WPF DataGrid綁定的集合操作, 跨線程, 如何解決耦合度問題?
01-13
我現在遇到一個棘手的問題, 一個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&
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 |