BindingOperations.EnableCollectionSynchronization 方法

定義

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

多載

EnableCollectionSynchronization(IEnumerable, Object)

使用簡單的鎖定機制,讓 CollectionView 物件能夠參與同步存取多個執行緒上所使用的集合。

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

使用簡單鎖定以外的機制,讓 CollectionView 物件能夠參與同步存取多個執行緒上所使用的集合。

備註

WPF 應用程式可以使用或其中一個子類別來顯示資料的 ItemsControl 集合, (ListBoxDataGridTreeViewListView 等) 。 WPF 通道會透過 的 CollectionView 子類別存取集合。 ItemsControlCollectionView 具有建立 所線上程的 ItemsControl 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。

您可能想要在多個執行緒上使用 集合。   例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權。   這通常是使用簡單的鎖定機制或更詳細的同步處理機制,例如旗號、重設事件等。

雖然您必須同步處理應用程式對集合的存取權,但您也必須保證從 WPF (特別從 CollectionView) 參與相同的同步處理機制。  您可以藉由呼叫 EnableCollectionSynchronization 方法執行這項作業。

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

  1. 選擇同步處理機制。

  2. 使用該機制將應用程式的所有存取同步處理至集合。

  3. 呼叫 EnableCollectionSynchronization 以通知 WPF 機制。

  4. 確定對集合的變更,以及透過 INotifyCollectionChanged) 變更 (的通知都是不可部分完成的;無法介入其他執行緒的存取權。  (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.)

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

  6. 如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 EnableCollectionSynchronization (和 DisableCollectionSynchronization ,並視需要個別呼叫) 。

  7. 避免死結。  這已經是應用程式在選擇使用同步處理之後的責任,但也必須將 WPF 參與同步處理納入考慮,如下列段落所述。

在傳回中,WPF 提供下列行為:

  • CollectionView 使用指定的同步處理機制來存取集合。

  • CollectionView 維護集合的「陰影複製」,以用於 UI 執行緒。

  • CollectionChanged 事件會在任何執行緒) 到達 (時排入佇列。

  • 當暫止事件有機會這麼做時,會以非同步方式套用至 UI 執行緒上的陰影複製。

  • CollectionView不會直接使用應用程式可見的任何其他同步處理機制。 這是 WPF 協助避免死結的方式, (看到上一個專案 7) 。  

淨效果是您可以在任何執行緒上變更集合,而這些變更最終會出現在 ItemsControl UI 執行緒有時間「趕上」時。  實作已調整為將變更流程流向 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 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。

您可能想要在多個執行緒上使用 集合。   例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權,並保證從 WPF (特別存取 CollectionView) 參與相同的同步處理機制。 藉由呼叫 EnableCollectionSynchronization(IEnumerable, Object) 方法,您可以使用簡單的鎖定機制來執行此動作。

若要在多個執行緒上使用集合,其中一個是擁有 的 ItemsControl UI 執行緒,您必須執行下列動作:

  1. 具現化物件以在存取集合時鎖定。

  2. 藉由鎖定該物件,將應用程式的所有存取同步處理至集合。

  3. 呼叫 EnableCollectionSynchronization(IEnumerable, Object) 以通知 WPF 您使用簡單的鎖定機制。

    • 呼叫必須在 UI 執行緒上發生。

    • 呼叫必須在不同的執行緒上使用集合之前,或在將集合附加至 ItemsControl 之前發生,無論稍後為何。

  4. 請確定透過) 變更集合的變更,以及該變更 INotifyCollectionChanged (的通知都是不可部分完成的;其他執行緒無法介入。  (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.) 保護

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

  6. 如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 (和 DisableCollectionSynchronization ,並視需要個別) 呼叫 EnableCollectionSynchronization

  7. 避免死結。  這已經是應用程式在選擇使用同步處理後的責任,但也必須考慮 WPF 參與同步處理。  (請參閱下方的詳細資訊。)

在傳回中,WPF 提供下列行為:

  • CollectionView 使用鎖定機制存取集合。

  • CollectionView 維護集合的「陰影複製」,以供 UI 執行緒使用。

  • CollectionChanged 事件會在任何執行緒) 到達時排入佇列 (。

  • 暫止事件會在 UI 執行緒上以非同步方式套用至陰影複製,而有機會這麼做。

  • CollectionView不會直接使用應用程式可見的任何其他同步處理機制。 這是 WPF 協助避免死結的方式, (看到上一個專案 7) 。  

淨效果是您可以在任何執行緒上變更集合,而這些變更最終會出現在 ItemsControl UI 執行緒有時間「趕上」時。  已微調實作,以節流變更至 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 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。

您可能想要在多個執行緒上使用 集合。   例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權,並保證從 WPF (特別存取 CollectionView) 參與相同的同步處理機制。 藉由呼叫 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 方法,您可以使用同步處理機制來執行此動作,例如信號、重設事件等等。

若要在多個執行緒上使用集合,其中一個是擁有 的 ItemsControl UI 執行緒,您必須執行下列動作:

  1. 選擇同步處理機制。

  2. 使用該機制將應用程式的所有存取同步處理至集合。

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)呼叫多載以通知 WPF 您使用的是簡單的鎖定以外的機制。

    • 呼叫必須在 UI 執行緒上發生。

    • 呼叫必須在不同的執行緒上使用集合之前,或在將集合附加至 ItemsControl 之前發生,無論稍後為何。

  4. 請確定透過) 變更集合的變更,以及該變更 INotifyCollectionChanged (的通知都是不可部分完成的;其他執行緒無法介入。  (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.) 保護

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

  6. 如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 (和 DisableCollectionSynchronization ,並視需要個別) 呼叫 EnableCollectionSynchronization

  7. 避免死結。  這已經是應用程式在選擇使用同步處理後的責任,但也必須考慮 WPF 參與同步處理。  (請參閱下方的詳細資訊。)

在傳回中,WPF 提供下列行為:

  • 呼叫 CollectionViewCollectionSynchronizationCallback 下列引數註冊的 來存取集合:

    • collection:感興趣的集合。
    • context:已註冊的內容物件。
    • accessMethod:執行實際存取權的委派。
    • writeAccesstrue 如果委派將修改集合,則為 , false 否則為 。

    您應該 CollectionSynchronizationCallback 使用 context 物件和 writeAccess 值,在集合上建立同步處理 (,視需要) 呼叫 accessMethod ,然後釋放同步處理。

  • CollectionView 維護集合的「陰影複製」,以供 UI 執行緒使用。

  • CollectionChanged 事件會在任何執行緒) 到達時排入佇列 (。

  • 暫止事件會在 UI 執行緒上以非同步方式套用至陰影複製,而有機會這麼做。

  • CollectionView不會直接使用應用程式可見的任何其他同步處理機制。 這是 WPF 協助避免死結的方式, (看到上一個專案 7) 。  

淨效果是您可以在任何執行緒上變更集合,而這些變更最終會出現在 ItemsControl UI 執行緒有時間「趕上」時。  已微調實作,以節流變更至 UI 執行緒的速率,讓背景執行緒無法飽和 UI 執行緒,並耗盡對一般使用者輸入的回應。

參數 context 是傳遞至 的 callback 任意物件。 您可以使用它來判斷用來控制對 之存取的 collection 同步處理機制。 Context 可以是 null

適用於