BindingOperations.EnableCollectionSynchronization 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
讓 CollectionView 物件能夠參與同步存取多個執行緒上所使用的集合。
多載
EnableCollectionSynchronization(IEnumerable, Object) |
使用簡單的鎖定機制,讓 CollectionView 物件能夠參與同步存取多個執行緒上所使用的集合。 |
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
使用簡單鎖定以外的機制,讓 CollectionView 物件能夠參與同步存取多個執行緒上所使用的集合。 |
備註
WPF 應用程式可以使用或其中一個子類別來顯示資料的 ItemsControl 集合, (ListBox 、 DataGrid 、 TreeView 、 ListView 等) 。 WPF 通道會透過 的 CollectionView 子類別存取集合。 ItemsControl和 CollectionView 具有建立 所線上程的 ItemsControl 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。
您可能想要在多個執行緒上使用 集合。 例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權。 這通常是使用簡單的鎖定機制或更詳細的同步處理機制,例如旗號、重設事件等。
雖然您必須同步處理應用程式對集合的存取權,但您也必須保證從 WPF (特別從 CollectionView) 參與相同的同步處理機制。 您可以藉由呼叫 EnableCollectionSynchronization 方法執行這項作業。
若要在多個執行緒上使用集合,其中一個是擁有 ItemsControl 的 UI 執行緒,應用程式具有下列責任:
選擇同步處理機制。
使用該機制將應用程式的所有存取同步處理至集合。
呼叫 EnableCollectionSynchronization 以通知 WPF 機制。
呼叫必須在 UI 執行緒上發生。
呼叫必須在不同的執行緒上使用集合之前,或在將集合附加至 ItemsControl 之前發生,無論稍後為何。
EnableCollectionSynchronization(IEnumerable, Object)如果使用簡單的鎖定機制,請呼叫多載;如果使用更詳細的機制, EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 請呼叫多載。
確定對集合的變更,以及透過 INotifyCollectionChanged) 變更 (的通知都是不可部分完成的;無法介入其他執行緒的存取權。 (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.)
如果您呼叫 DisableCollectionSynchronization ,該呼叫也必須發生在 UI 執行緒上。
如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 EnableCollectionSynchronization (和 DisableCollectionSynchronization ,並視需要個別呼叫) 。
避免死結。 這已經是應用程式在選擇使用同步處理之後的責任,但也必須將 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 集合, (ListBox 、 DataGrid 、 TreeView 、 ListView 等) 。 WPF 通道會透過 的 CollectionView 子類別存取集合。 ItemsControl和 CollectionView 具有建立 所線上程的 ItemsControl 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。
您可能想要在多個執行緒上使用 集合。 例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權,並保證從 WPF (特別存取 CollectionView) 參與相同的同步處理機制。 藉由呼叫 EnableCollectionSynchronization(IEnumerable, Object) 方法,您可以使用簡單的鎖定機制來執行此動作。
若要在多個執行緒上使用集合,其中一個是擁有 的 ItemsControl UI 執行緒,您必須執行下列動作:
具現化物件以在存取集合時鎖定。
藉由鎖定該物件,將應用程式的所有存取同步處理至集合。
呼叫 EnableCollectionSynchronization(IEnumerable, Object) 以通知 WPF 您使用簡單的鎖定機制。
呼叫必須在 UI 執行緒上發生。
呼叫必須在不同的執行緒上使用集合之前,或在將集合附加至 ItemsControl 之前發生,無論稍後為何。
請確定透過) 變更集合的變更,以及該變更 INotifyCollectionChanged (的通知都是不可部分完成的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.) 保護
如果您呼叫 DisableCollectionSynchronization ,該呼叫也必須發生在 UI 執行緒上。
如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 (和 DisableCollectionSynchronization ,並視需要個別) 呼叫 EnableCollectionSynchronization 。
避免死結。 這已經是應用程式在選擇使用同步處理後的責任,但也必須考慮 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 集合, (ListBox 、 DataGrid 、 TreeView 、 ListView 等) 。 WPF 通道會透過 的 CollectionView 子類別存取集合。 ItemsControl和 CollectionView 具有建立 所線上程的 ItemsControl 親和性,這表示在不同的執行緒上使用它們是禁止的,並擲回例外狀況。 實際上,這項限制也適用于集合。
您可能想要在多個執行緒上使用 集合。 例如,您想要更新集合 (在「資料收集」執行緒上新增或移除專案) ,同時在「使用者介面」執行緒上顯示結果,讓 UI 在資料收集發生時保持回應。 在這種情況下,您必須負責確保同步處理 (「安全線程」) 集合的存取權,並保證從 WPF (特別存取 CollectionView) 參與相同的同步處理機制。 藉由呼叫 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 方法,您可以使用同步處理機制來執行此動作,例如信號、重設事件等等。
若要在多個執行緒上使用集合,其中一個是擁有 的 ItemsControl UI 執行緒,您必須執行下列動作:
選擇同步處理機制。
使用該機制將應用程式的所有存取同步處理至集合。
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)呼叫多載以通知 WPF 您使用的是簡單的鎖定以外的機制。
呼叫必須在 UI 執行緒上發生。
呼叫必須在不同的執行緒上使用集合之前,或在將集合附加至 ItemsControl 之前發生,無論稍後為何。
請確定透過) 變更集合的變更,以及該變更 INotifyCollectionChanged (的通知都是不可部分完成的;其他執行緒無法介入。 (這通常是免費的。例如, ObservableCollection<T> 保證這一點,前提是所有變更都受到 synchronization.) 保護
如果您呼叫 DisableCollectionSynchronization ,該呼叫也必須發生在 UI 執行緒上。
如果您想要在多個 UI 執行緒上使用相同的集合,則必須在每個 UI 執行緒上個別呼叫 (和 DisableCollectionSynchronization ,並視需要個別) 呼叫 EnableCollectionSynchronization 。
避免死結。 這已經是應用程式在選擇使用同步處理後的責任,但也必須考慮 WPF 參與同步處理。 (請參閱下方的詳細資訊。)
在傳回中,WPF 提供下列行為:
呼叫 CollectionView 以 CollectionSynchronizationCallback 下列引數註冊的 來存取集合:
-
collection
:感興趣的集合。 -
context
:已註冊的內容物件。 -
accessMethod
:執行實際存取權的委派。 -
writeAccess
:true
如果委派將修改集合,則為 ,false
否則為 。
您應該 CollectionSynchronizationCallback 使用
context
物件和writeAccess
值,在集合上建立同步處理 (,視需要) 呼叫accessMethod
,然後釋放同步處理。-
會 CollectionView 維護集合的「陰影複製」,以供 UI 執行緒使用。
CollectionChanged 事件會在任何執行緒) 到達時排入佇列 (。
暫止事件會在 UI 執行緒上以非同步方式套用至陰影複製,而有機會這麼做。
CollectionView不會直接使用應用程式可見的任何其他同步處理機制。 這是 WPF 協助避免死結的方式, (看到上一個專案 7) 。
淨效果是您可以在任何執行緒上變更集合,而這些變更最終會出現在 ItemsControl UI 執行緒有時間「趕上」時。 已微調實作,以節流變更至 UI 執行緒的速率,讓背景執行緒無法飽和 UI 執行緒,並耗盡對一般使用者輸入的回應。
參數 context
是傳遞至 的 callback
任意物件。 您可以使用它來判斷用來控制對 之存取的 collection
同步處理機制。
Context
可以是 null
。