BindingOperations.EnableCollectionSynchronization Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Consente a un oggetto CollectionView di partecipare all'accesso sincronizzato a una raccolta usata in più thread.
Overload
EnableCollectionSynchronization(IEnumerable, Object) |
Consente a un oggetto CollectionView di partecipare all'accesso sincronizzato a una raccolta usata in più thread tramite un meccanismo di blocco semplice. |
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
Consente a un oggetto CollectionView di partecipare all'accesso sincronizzato a una raccolta usata in più thread tramite un meccanismo diverso dal blocco semplice. |
Commenti
Un'applicazione WPF può visualizzare una raccolta di dati usando una ItemsControl o una delle relative sottoclassi (ListBox, DataGridTreeView, , ListViewe così via). WPF canalirà tutto l'accesso alla raccolta tramite una sottoclasse di CollectionView. ItemsControl Sia l'oggetto che CollectionView l'hanno affinità con il thread in cui ItemsControl è stato creato, ovvero che l'uso su un thread diverso è vietato e genera un'eccezione. In effetti, questa restrizione si applica anche alla raccolta.
È possibile usare la raccolta in più thread. Ad esempio, si vuole aggiornare la raccolta (aggiungere o rimuovere elementi) in un thread "raccolta dati", durante la visualizzazione dei risultati in un thread "interfaccia utente", in modo che l'interfaccia utente rimanga reattiva durante la raccolta dei dati. In tale situazione, si è responsabili di garantire l'accesso sincronizzato ("thread-safe") alla raccolta. Questa operazione viene in genere eseguita usando un semplice meccanismo di blocco o un meccanismo di sincronizzazione più elaborato, ad esempio i semafori, gli eventi di reimpostazione e così via.
Anche se è necessario sincronizzare l'accesso dell'applicazione alla raccolta, è anche necessario garantire che l'accesso da WPF (in particolare da CollectionView) partecipa allo stesso meccanismo di sincronizzazione. A tale scopo, è possibile chiamare il metodo EnableCollectionSynchronization.
Per usare una raccolta su più thread, uno dei quali è il thread dell'interfaccia utente proprietario di ItemsControl, un'applicazione ha le responsabilità seguenti:
Scegliere un meccanismo di sincronizzazione.
Sincronizzare tutti gli accessi dall'applicazione alla raccolta usando tale meccanismo.
Chiamata EnableCollectionSynchronization per informare WPF del meccanismo.
La chiamata deve verificarsi nel thread dell'interfaccia utente.
La chiamata deve verificarsi prima di usare la raccolta in un thread diverso o prima di collegare la raccolta a ItemsControl, che è successivamente.
Chiamare l'overload se si usa un meccanismo di blocco semplice; chiamare l'overload EnableCollectionSynchronization(IEnumerable, Object)EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) se si usa un meccanismo più elaborato.
Assicurarsi che una modifica alla raccolta e la notifica di tale modifica (tramite INotifyCollectionChanged) siano atomiche. Nessun accesso da altri thread può intervenire. (Questo è in genere gratuito. Garantisce, ad esempio, ObservableCollection<T> che tutte le modifiche siano protette dalla sincronizzazione.
Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.
Se si vuole usare la stessa raccolta in più thread dell'interfaccia utente, è necessario chiamare EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessario) separatamente in ogni thread dell'interfaccia utente.
Evitare deadlock. Questa è già la responsabilità dell'applicazione dopo aver scelto di usare la sincronizzazione, ma deve anche tenere conto della partecipazione di WPF alla sincronizzazione, come illustrato nel paragrafo seguente.
In alternativa, WPF fornisce il comportamento seguente:
Accede CollectionView alla raccolta usando il meccanismo di sincronizzazione specificato.
Mantiene CollectionView una "copia shadow" della raccolta da usare nel thread dell'interfaccia utente.
CollectionChanged gli eventi vengono accodati quando arrivano (in qualsiasi thread).
Gli eventi in sospeso vengono applicati alla copia shadow in modo asincrono nel thread dell'interfaccia utente quando ha la possibilità di farlo.
L'oggetto CollectionView non userà direttamente alcun altro meccanismo di sincronizzazione visibile all'applicazione. Questo è il modo di aiutare a evitare deadlock (vedere l'elemento 7 precedente).
L'effetto netto è che è possibile modificare la raccolta in qualsiasi thread e queste modifiche vengono visualizzate in ItemsControl quando il thread dell'interfaccia utente ha il tempo di "recuperare". L'implementazione è stata ottimizzata per limitare la frequenza di modifica del flusso nel thread dell'interfaccia utente per impedire ai thread in background di saturazione del thread dell'interfaccia utente e di scorrere la risposta all'input utente normale.
EnableCollectionSynchronization(IEnumerable, Object)
Consente a un oggetto CollectionView di partecipare all'accesso sincronizzato a una raccolta usata in più thread tramite un meccanismo di blocco semplice.
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)
Parametri
- collection
- IEnumerable
Raccolta che richiede l'accesso sincronizzato.
- lockObject
- Object
Oggetto da bloccare quando si accede alla raccolta.
Commenti
Un'applicazione WPF può visualizzare una raccolta di dati usando una ItemsControl o una delle relative sottoclassi (ListBox, DataGridTreeView, , ListViewe così via). WPF canalirà tutto l'accesso alla raccolta tramite una sottoclasse di CollectionView. ItemsControl Sia l'oggetto che CollectionView l'hanno affinità con il thread in cui ItemsControl è stato creato, ovvero che l'uso su un thread diverso è vietato e genera un'eccezione. In effetti, questa restrizione si applica anche alla raccolta.
È possibile usare la raccolta in più thread. Ad esempio, si vuole aggiornare la raccolta (aggiungere o rimuovere elementi) in un thread "raccolta dati", durante la visualizzazione dei risultati in un thread "interfaccia utente", in modo che l'interfaccia utente rimanga reattiva durante la raccolta dei dati. In tale situazione, si è responsabili di garantire l'accesso sincronizzato ("thread-safe") alla raccolta e per garantire che l'accesso da WPF (in particolare da CollectionView) partecipa allo stesso meccanismo di sincronizzazione. Chiamando il EnableCollectionSynchronization(IEnumerable, Object) metodo, è possibile eseguire questa operazione usando un semplice meccanismo di blocco.
Per usare una raccolta su più thread, una delle quali è il thread dell'interfaccia ItemsControlutente proprietario di , è necessario eseguire le operazioni seguenti:
Creare un'istanza di un oggetto per bloccare quando si accede alla raccolta.
Sincronizzare tutti gli accessi dall'applicazione alla raccolta bloccando tale oggetto.
Chiamare EnableCollectionSynchronization(IEnumerable, Object) per informare WPF che si usa un semplice meccanismo di blocco.
La chiamata deve verificarsi nel thread dell'interfaccia utente.
La chiamata deve verificarsi prima di usare la raccolta in un thread diverso o prima di collegare la raccolta a ItemsControl, che è successivamente.
Assicurarsi che una modifica alla raccolta e la notifica di tale modifica (tramite INotifyCollectionChanged) siano atomiche. Nessun accesso da altri thread può intervenire. (Questo è in genere gratuito. Garantisce, ad esempio, ObservableCollection<T> che tutte le modifiche siano protette dalla sincronizzazione.
Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.
Se si vuole usare la stessa raccolta in più thread dell'interfaccia utente, è necessario chiamare EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessario) separatamente in ogni thread dell'interfaccia utente.
Evitare deadlock. Questa è già la responsabilità dell'applicazione dopo aver scelto di usare la sincronizzazione, ma deve anche tenere conto della partecipazione di WPF alla sincronizzazione. Vedere altre informazioni, di seguito.
In alternativa, WPF fornisce il comportamento seguente:
Accede CollectionView alla raccolta usando il meccanismo di blocco.
Mantiene CollectionView una "copia shadow" della raccolta da usare nel thread dell'interfaccia utente.
CollectionChanged gli eventi vengono accodati quando arrivano (in qualsiasi thread).
Gli eventi in sospeso vengono applicati alla copia shadow in modo asincrono nel thread dell'interfaccia utente quando ha la possibilità di farlo.
L'oggetto CollectionView non userà direttamente alcun altro meccanismo di sincronizzazione visibile all'applicazione. Questo è il modo di aiutare a evitare deadlock (vedere l'elemento 7 precedente).
L'effetto netto è che è possibile modificare la raccolta in qualsiasi thread e queste modifiche vengono visualizzate in ItemsControl quando il thread dell'interfaccia utente ha il tempo di "recuperare". L'implementazione è stata ottimizzata per limitare la frequenza di modifica del flusso nel thread dell'interfaccia utente per impedire ai thread in background di saturazione del thread dell'interfaccia utente e di scorrere la risposta all'input utente normale.
Si applica a
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
Consente a un oggetto CollectionView di partecipare all'accesso sincronizzato a una raccolta usata in più thread tramite un meccanismo diverso dal blocco semplice.
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)
Parametri
- collection
- IEnumerable
Raccolta che richiede l'accesso sincronizzato.
- context
- Object
Oggetto che viene passato al callback.
- synchronizationCallback
- CollectionSynchronizationCallback
Callback che viene richiamato ogni volta che è richiesto l'accesso alla raccolta. Può essere usato per garantire che l'accesso alla raccolta venga eseguito da un solo thread alla volta.
Commenti
Un'applicazione WPF può visualizzare una raccolta di dati usando una ItemsControl o una delle relative sottoclassi (ListBox, DataGridTreeView, , ListViewe così via). WPF canalirà tutto l'accesso alla raccolta tramite una sottoclasse di CollectionView. ItemsControl Sia l'oggetto che CollectionView l'hanno affinità con il thread in cui ItemsControl è stato creato, ovvero che l'uso su un thread diverso è vietato e genera un'eccezione. In effetti, questa restrizione si applica anche alla raccolta.
È possibile usare la raccolta in più thread. Ad esempio, si vuole aggiornare la raccolta (aggiungere o rimuovere elementi) in un thread "raccolta dati", durante la visualizzazione dei risultati in un thread "interfaccia utente", in modo che l'interfaccia utente rimanga reattiva durante la raccolta dei dati. In tale situazione, si è responsabili di garantire l'accesso sincronizzato ("thread-safe") alla raccolta e per garantire che l'accesso da WPF (in particolare da CollectionView) partecipa allo stesso meccanismo di sincronizzazione. Chiamando il EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) metodo, è possibile eseguire questa operazione usando un meccanismo di sincronizzazione, ad esempio un semaforo, un evento di reimpostazione e così via.
Per usare una raccolta su più thread, una delle quali è il thread dell'interfaccia ItemsControlutente proprietario di , è necessario eseguire le operazioni seguenti:
Scegliere un meccanismo di sincronizzazione.
Sincronizzare tutti gli accessi dall'applicazione alla raccolta usando tale meccanismo.
Chiamare l'overload EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) per informare WPF che si usa un meccanismo diverso da un blocco semplice.
La chiamata deve verificarsi nel thread dell'interfaccia utente.
La chiamata deve verificarsi prima di usare la raccolta in un thread diverso o prima di collegare la raccolta a ItemsControl, che è successivamente.
Assicurarsi che una modifica alla raccolta e la notifica di tale modifica (tramite INotifyCollectionChanged) siano atomiche. Nessun accesso da altri thread può intervenire. (Questo è in genere gratuito. Garantisce, ad esempio, ObservableCollection<T> che tutte le modifiche siano protette dalla sincronizzazione.
Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.
Se si vuole usare la stessa raccolta in più thread dell'interfaccia utente, è necessario chiamare EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessario) separatamente in ogni thread dell'interfaccia utente.
Evitare deadlock. Questa è già la responsabilità dell'applicazione dopo aver scelto di usare la sincronizzazione, ma deve anche tenere conto della partecipazione di WPF alla sincronizzazione. Vedere altre informazioni, di seguito.
In alternativa, WPF fornisce il comportamento seguente:
L'accesso CollectionView alla raccolta chiama l'oggetto registrato CollectionSynchronizationCallback con gli argomenti seguenti:
-
collection
: raccolta di interesse. -
context
: oggetto contesto registrato. -
accessMethod
: delegato che esegue l'accesso effettivo. -
writeAccess
:true
se il delegato modifica la raccolta;false
in caso contrario.
È CollectionSynchronizationCallback consigliabile stabilire la sincronizzazione nella raccolta (usando l'oggetto e il
context
writeAccess
valore, come appropriato), chiamare laaccessMethod
sincronizzazione , quindi rilasciare.-
Mantiene CollectionView una "copia shadow" della raccolta da usare nel thread dell'interfaccia utente.
CollectionChanged gli eventi vengono accodati quando arrivano (in qualsiasi thread).
Gli eventi in sospeso vengono applicati alla copia shadow in modo asincrono nel thread dell'interfaccia utente quando ha la possibilità di farlo.
L'oggetto CollectionView non userà direttamente alcun altro meccanismo di sincronizzazione visibile all'applicazione. Questo è il modo di aiutare a evitare deadlock (vedere l'elemento 7 precedente).
L'effetto netto è che è possibile modificare la raccolta in qualsiasi thread e queste modifiche vengono visualizzate in ItemsControl quando il thread dell'interfaccia utente ha il tempo di "recuperare". L'implementazione è stata ottimizzata per limitare la frequenza di modifica del flusso nel thread dell'interfaccia utente per impedire ai thread in background di saturazione del thread dell'interfaccia utente e di scorrere la risposta all'input utente normale.
Il context
parametro è un oggetto arbitrario passato a callback
. È possibile usarlo per determinare il meccanismo di sincronizzazione usato per controllare l'accesso a collection
.
Context
può essere null
.