Condividi tramite


BindingOperations.EnableCollectionSynchronization Metodo

Definizione

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 CollectionViewItemsControl 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:

  1. Scegliere un meccanismo di sincronizzazione.

  2. Sincronizzare tutti gli accessi dall'applicazione alla raccolta usando tale meccanismo.

  3. Chiamata EnableCollectionSynchronization per informare WPF del meccanismo.

  4. 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.

  5. Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.

  6. 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.

  7. 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 CollectionViewItemsControl 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:

  1. Creare un'istanza di un oggetto per bloccare quando si accede alla raccolta.

  2. Sincronizzare tutti gli accessi dall'applicazione alla raccolta bloccando tale oggetto.

  3. 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.

  4. 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.

  5. Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.

  6. 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.

  7. 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 CollectionViewItemsControl 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:

  1. Scegliere un meccanismo di sincronizzazione.

  2. Sincronizzare tutti gli accessi dall'applicazione alla raccolta usando tale meccanismo.

  3. 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.

  4. 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.

  5. Se si chiama DisableCollectionSynchronization, tale chiamata deve verificarsi anche nel thread dell'interfaccia utente.

  6. 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.

  7. 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 contextwriteAccess valore, come appropriato), chiamare la accessMethodsincronizzazione , 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.

Si applica a