BindingOperations.EnableCollectionSynchronization 方法

定義

使物件能 CollectionView 參與對多個執行緒共用的集合的同步存取。

多載

名稱 Description
EnableCollectionSynchronization(IEnumerable, Object)

透過簡單的鎖定機制,使 CollectionView 物件能參與對多個執行緒共用集合的同步存取。

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

透過非單純鎖機制,使物件能 CollectionView 參與多執行緒共用的集合的同步存取。

備註

WPF應用程式可以使用 ItemsControl 或其子類別之一(ListBoxDataGridTreeViewListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。

你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取。 這通常透過簡單的鎖定機制或更複雜的同步機制,如臂量、重置事件等來完成。

雖然你必須同步應用程式對集合的存取,但你也必須確保來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 你透過呼叫方法 EnableCollectionSynchronization 來完成這件事。

若要在多個執行緒中使用集合,其中一個是擁有 ItemsControl的 UI 執行緒,應用程式有以下職責:

  1. 選擇同步機制。

  2. 利用該機制同步應用程式與集合的所有存取。

  3. 請呼叫 EnableCollectionSynchronization 以告知WPF機制。

  4. 確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)

  5. 如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。

  6. 如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。

  7. 避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 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 或其子類別之一(ListBoxDataGridTreeViewListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。

你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取,並保證來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 透過呼叫該 EnableCollectionSynchronization(IEnumerable, Object) 方法,你可以使用簡單的鎖定機制來達成這個功能。

若要在多個執行緒中使用一個集合,其中一個是擁有 ItemsControl的 UI 執行緒,你必須執行以下操作:

  1. 在存取集合時,實例化一個物件來鎖定。

  2. 透過鎖定該物件,將應用程式與集合的所有存取同步。

  3. 請致電 EnableCollectionSynchronization(IEnumerable, Object) 告知WPF您使用的是簡單的鎖具機構。

    • 呼叫必須在 UI 執行緒中進行。

    • 呼叫必須在將集合用於其他執行緒或將集合附加到 ItemsControl以較晚者為準前完成。

  4. 確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)

  5. 如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。

  6. 如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。

  7. 避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 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 或其子類別之一(ListBoxDataGridTreeViewListView 等)來顯示一組資料。 WPF 透過 CollectionView 子類來引導所有對收藏的存取。 與 ItemsControlCollectionView 的 都與所建立的執行緒 ItemsControl 有親和力,意味著禁止在不同執行緒中使用並拋出例外。 實際上,這項限制同樣適用於該收藏。

你可能想在多個討論串中使用這個集合。 例如,你想在「資料收集」執行緒中更新收藏(新增或移除項目),同時在「使用者介面」執行緒中顯示結果,讓使用者介面在資料收集過程中保持反應。 在這種情況下,你有責任確保對集合的同步(「執行緒安全」)存取,並保證來自WPF(特別是來自 CollectionView)的存取也參與相同的同步機制。 透過呼叫該 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 方法,你可以利用同步機制,例如信號量、重置事件等。

若要在多個執行緒中使用一個集合,其中一個是擁有 ItemsControl的 UI 執行緒,你必須執行以下操作:

  1. 選擇同步機制。

  2. 利用該機制同步應用程式與集合的所有存取。

  3. 呼叫 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 過載,告知WPF你使用的是非單純鎖定的機制。

    • 呼叫必須在 UI 執行緒中進行。

    • 呼叫必須在將集合用於其他執行緒或將集合附加到 ItemsControl以較晚者為準前完成。

  4. 確保集合的變更及其變更通知(透過 INotifyCollectionChanged)是原子性的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 只要所有變更都受到同步保護,就能保證這一點。)

  5. 如果你呼叫 DisableCollectionSynchronization,該呼叫也必須發生在 UI 執行緒上。

  6. 如果你想在多個 UI 執行緒中使用同一個集合,必須在每個 UI 執行緒分別呼叫 EnableCollectionSynchronization (如 DisableCollectionSynchronization有需要)。

  7. 避免僵局。 一旦應用程式選擇使用同步,這已經是其責任,但同時也必須考慮 WPF 在同步過程中的參與。 (詳情見下文。)

作為交換,WPF 提供以下行為:

  • CollectionView 集合透過呼叫 CollectionSynchronizationCallback 註冊物件並使用以下參數存取:

    • collection:感興趣的收藏。
    • context:註冊的上下文物件。
    • accessMethod:一個執行實際存取的代理。
    • writeAccesstrue 如果代表會修改該集合; false 否則。

    CollectionSynchronizationCallback 應該在集合上建立同步(使用 context 物件和 writeAccess 值,視情況而定),然後呼叫 , accessMethod然後釋放同步。

  • 他們 CollectionView 會維護一個集合的「影子副本」,用於 UI 執行緒。

  • CollectionChanged 事件會在抵達時排隊(在任何執行緒中)。

  • 待處理事件會在 UI 執行緒有機會時,非同步地套用到影子複製。

  • 它們 CollectionView 不會直接使用應用程式可見的其他同步機制。 這是 WPF 幫助避免僵局的方式(見前述第 7 項)。

最終效果是你可以在任何執行緒上更改集合,這些變更最終會在 UI 執行緒有時間「追上」時出現 ItemsControl 。 實作已調整為限制變更流向 UI 執行緒的速率,避免背景執行緒飽和 UI 執行緒,導致對正常使用者輸入的回應不足。

參數 context 是一個任意的物件,傳遞給 callback。 你可以用它來判斷用於控制存取 collection的同步機制。 Context 可以是 null

適用於