BindingOperations.EnableCollectionSynchronization 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
使物件能 CollectionView 參與對多個執行緒共用的集合的同步存取。
多載
| 名稱 | Description |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
透過簡單的鎖定機制,使 CollectionView 物件能參與對多個執行緒共用集合的同步存取。 |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
透過非單純鎖機制,使物件能 CollectionView 參與多執行緒共用的集合的同步存取。 |
備註
WPF應用程式可以使用 ItemsControl 或其子類別之一(ListBox、DataGrid、TreeView、ListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。
你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取。 這通常透過簡單的鎖定機制或更複雜的同步機制,如臂量、重置事件等來完成。
雖然你必須同步應用程式對集合的存取,但你也必須確保來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 你透過呼叫方法 EnableCollectionSynchronization 來完成這件事。
若要在多個執行緒中使用集合,其中一個是擁有 ItemsControl的 UI 執行緒,應用程式有以下職責:
選擇同步機制。
利用該機制同步應用程式與集合的所有存取。
請呼叫 EnableCollectionSynchronization 以告知WPF機制。
呼叫必須在 UI 執行緒中進行。
呼叫必須在將集合用於其他執行緒或將集合附加到 ItemsControl以較晚者為準前完成。
若使用簡單鎖定機制,則呼叫過載;若使用更複雜的機制,則呼叫EnableCollectionSynchronization(IEnumerable, Object)EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)過載。
確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)
如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。
如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。
避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 WPF 在同步中的參與,詳見下一段說明。
作為交換,WPF 提供以下行為:
該系統 CollectionView 會利用指定的同步機制存取該集合。
他們 CollectionView 會維護一個集合的「影子副本」,用於 UI 執行緒。
CollectionChanged 事件會在抵達時排隊(在任何執行緒中)。
待處理事件會在 UI 執行緒有機會時,非同步地套用到影子複製。
它們 CollectionView 不會直接使用應用程式可見的其他同步機制。 這是 WPF 幫助避免僵局的方式(見前述第 7 項)。
最終效果是你可以在任何執行緒上更改集合,這些變更最終會在 UI 執行緒有時間「追上」時出現 ItemsControl 。 實作已調整為限制變更流向 UI 執行緒的速率,避免背景執行緒飽和 UI 執行緒,導致對正常使用者輸入的回應不足。
EnableCollectionSynchronization(IEnumerable, Object)
透過簡單的鎖定機制,使 CollectionView 物件能參與對多個執行緒共用集合的同步存取。
public:
static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ lockObject);
public static void EnableCollectionSynchronization(System.Collections.IEnumerable collection, object lockObject);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, lockObject As Object)
參數
- collection
- IEnumerable
需要同步存取的收藏。
- lockObject
- Object
存取集合時要鎖定的物件。
備註
WPF應用程式可以使用 ItemsControl 或其子類別之一(ListBox、DataGrid、TreeView、ListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。
你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取,並保證來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 透過呼叫該 EnableCollectionSynchronization(IEnumerable, Object) 方法,你可以使用簡單的鎖定機制來達成這個功能。
若要在多個執行緒中使用一個集合,其中一個是擁有 ItemsControl的 UI 執行緒,你必須執行以下操作:
在存取集合時,實例化一個物件來鎖定。
透過鎖定該物件,將應用程式與集合的所有存取同步。
請致電 EnableCollectionSynchronization(IEnumerable, Object) 告知WPF您使用的是簡單的鎖具機構。
呼叫必須在 UI 執行緒中進行。
呼叫必須在將集合用於其他執行緒或將集合附加到 ItemsControl以較晚者為準前完成。
確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)
如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。
如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。
避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 WPF 在同步過程中的參與。 (詳情見下文。)
作為交換,WPF 提供以下行為:
該機構 CollectionView 利用鎖定機制存取收藏。
他們 CollectionView 會維護一個集合的「影子副本」,用於 UI 執行緒。
CollectionChanged 事件會在抵達時排隊(在任何執行緒中)。
待處理事件會在 UI 執行緒有機會時,非同步地套用到影子複製。
它們 CollectionView 不會直接使用應用程式可見的其他同步機制。 這是 WPF 幫助避免僵局的方式(見前述第 7 項)。
最終效果是你可以在任何執行緒上更改集合,這些變更最終會在 UI 執行緒有時間「追上」時出現 ItemsControl 。 實作已調整為限制變更流向 UI 執行緒的速率,避免背景執行緒飽和 UI 執行緒,導致對正常使用者輸入的回應不足。
適用於
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
透過非單純鎖機制,使物件能 CollectionView 參與多執行緒共用的集合的同步存取。
public:
static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ context, System::Windows::Data::CollectionSynchronizationCallback ^ synchronizationCallback);
public static void EnableCollectionSynchronization(System.Collections.IEnumerable collection, object context, System.Windows.Data.CollectionSynchronizationCallback synchronizationCallback);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj * System.Windows.Data.CollectionSynchronizationCallback -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, context As Object, synchronizationCallback As CollectionSynchronizationCallback)
參數
- collection
- IEnumerable
需要同步存取的收藏。
- context
- Object
一個傳遞給回調的物件。
- synchronizationCallback
- CollectionSynchronizationCallback
每當需要存取集合時會呼叫的回調。 你可以用它來確保收藏是一次只用一個執行緒來存取。
備註
WPF應用程式可以使用 ItemsControl 或其子類別之一(ListBox、DataGrid、TreeView、ListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。
你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取,並保證來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 透過呼叫該 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 方法,你可以利用同步機制,例如信號量、重置事件等。
若要在多個執行緒中使用一個集合,其中一個是擁有 ItemsControl的 UI 執行緒,你必須執行以下操作:
選擇同步機制。
利用該機制同步應用程式與集合的所有存取。
呼叫 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 過載,告知WPF你使用的是非單純鎖定的機制。
呼叫必須在 UI 執行緒中進行。
呼叫必須在將集合用於其他執行緒或將集合附加到 ItemsControl以較晚者為準前完成。
確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)
如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。
如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。
避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 WPF 在同步過程中的參與。 (詳情見下文。)
作為交換,WPF 提供以下行為:
該 CollectionView 集合透過呼叫 CollectionSynchronizationCallback 註冊物件並使用以下參數存取:
-
collection:感興趣的收藏。 -
context:註冊的上下文物件。 -
accessMethod:一個執行實際存取的代理。 -
writeAccess:true如果代表會修改該集合;false否則。
你 CollectionSynchronizationCallback 應該在集合上建立同步(使用
context物件和writeAccess值,視情況而定),然後呼叫 ,accessMethod然後釋放同步。-
他們 CollectionView 會維護一個集合的「影子副本」,用於 UI 執行緒。
CollectionChanged 事件會在抵達時排隊(在任何執行緒中)。
待處理事件會在 UI 執行緒有機會時,非同步地套用到影子複製。
它們 CollectionView 不會直接使用應用程式可見的其他同步機制。 這是 WPF 幫助避免僵局的方式(見前述第 7 項)。
最終效果是你可以在任何執行緒上更改集合,這些變更最終會在 UI 執行緒有時間「追上」時出現 ItemsControl 。 實作已調整為限制變更流向 UI 執行緒的速率,避免背景執行緒飽和 UI 執行緒,導致對正常使用者輸入的回應不足。
參數 context 是一個任意的物件,傳遞給 callback。 你可以用它來判斷用於控制存取 collection的同步機制。
Context 可以是 null。