簡體   English   中英

如何處理 WPF 數據庫應用程序中的調度程序問題?

[英]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 包括ObservableCollectionConcurrentBag ,但它們有同樣的問題。

我可以通過綁定到列表的副本( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM