[英]How do I deal with dispatcher issue in WPF database application?
我正在開發一個應用程序(使用 C# 和 WPF),它為 SQL 數據庫提供用戶界面。 應用程序的多個實例同時訪問和修改數據庫,因此應用程序會定期從數據庫中請求自上次請求以來已修改的記錄,並將這些記錄加載到使用 XML 反序列化的復雜類列表中。
通過將列表綁定到 WPF 的 ListView 控件的 ItemsSource 屬性,將列表呈現給用戶。 這最初效果很好,但是當列表更新時(特別是在添加或刪除項目時),我收到此錯誤:
“這種類型的 CollectionView 不支持從不同於 Dispatcher 線程的線程更改其 SourceCollection。”
我理解這個問題,UI 線程想要通過 ListView 的調度程序的安全性來控制綁定的數據集並添加或刪除數據。 但是,似乎必須有一種方法可以為非單個用戶專有的數據提供線程安全的 UI。
我嘗試了各種不同類型的 collections 包括ObservableCollection
和ConcurrentBag
,但它們有同樣的問題。
我可以通過綁定到列表的副本( List.ToList<>()
)來規避這個問題,並在列表更新時使用事件觸發重新綁定到新副本,但這看起來很笨拙,違背了目的ListViews 和綁定,遠非 C# 或 WPF 的優雅。
我錯過了一些明顯的東西嗎? 謝謝你的幫助!
有時BindingOperations.EnableCollectionSynchronization
會有所幫助。
它使 CollectionView object 能夠參與對在多個線程上使用的集合的同步訪問。
BindingOperations.EnableCollectionSynchronization(collection, lockObject);
要在多個線程上使用集合,其中之一是擁有 ItemsControl 的 UI 線程,您必須實例化 object 以在訪問集合時鎖定。
調用 EnableCollectionSynchronization(IEnumerable, Object) 通知 WPF 您正在使用簡單的鎖定機制。 調用必須發生在 UI 線程上。
調用必須在在不同線程上使用集合之前或在將集合附加到 ItemsControl 之前發生,以較晚者為准。
通常,我在視圖 model 的構造函數中調用BindingOperations.EnableCollectionSynchronization(collection, lockObject)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.