BindingOperations.EnableCollectionSynchronization Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Permite que um CollectionView objeto participe num acesso sincronizado a uma coleção utilizada em múltiplos threads.
Sobrecargas
| Name | Description |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
Permite que um CollectionView objeto participe num acesso sincronizado a uma coleção usada em múltiplos threads usando um mecanismo simples de bloqueio. |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
Permite que um CollectionView objeto participe em acesso sincronizado a uma coleção usada em múltiplos threads usando um mecanismo diferente de um simples bloqueio. |
Observações
Uma aplicação WPF pode exibir uma coleção de dados usando um ItemsControl ou uma das suas subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo o seu acesso à coleção através de uma subclasse de CollectionView. Tanto o ItemsControl como o CollectionView têm afinidade com o fio em que o ItemsControl foi criado, o que significa que usá-los num fio diferente é proibido e cria uma exceção. Na prática, esta restrição aplica-se também à coleção.
Podes querer usar a coleção em vários threads. Por exemplo, deve atualizar a coleção (adicionar ou remover itens) num tópico de "recolha de dados", enquanto exibe os resultados num tópico de "interface de utilizador", para que a interface se mantenha responsiva durante a recolha de dados. Nessa situação, é responsável por garantir o acesso sincronizado ("thread-safe") à coleção. Isto é normalmente feito usando um mecanismo de bloqueio simples ou um mecanismo de sincronização mais elaborado, como semáforos, eventos de reset, etc.
Embora deva sincronizar o acesso da sua aplicação à coleção, também deve garantir que o acesso de WPF (especificamente de CollectionView) participa no mesmo mecanismo de sincronização. Faz-se isto chamando o EnableCollectionSynchronization método.
Para usar uma coleção em múltiplos threads, um dos quais é o thread de UI que detém o ItemsControl, uma aplicação tem as seguintes responsabilidades:
Escolha um mecanismo de sincronização.
Sincronize todos os acessos da aplicação para a coleção usando esse mecanismo.
Ligue para EnableCollectionSynchronization para informar WPF sobre o mecanismo.
A chamada deve ocorrer no tópico da interface.
A chamada deve ocorrer antes de usar a coleção numa thread diferente ou antes de anexar a coleção à ItemsControl, o que ocorrer mais tarde.
Chame a EnableCollectionSynchronization(IEnumerable, Object) sobrecarga se estiver a usar um mecanismo de bloqueio simples; chame a EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) sobrecarga se estiver a usar um mecanismo mais elaborado.
Assegure que uma alteração na coleção e a notificação dessa alteração (através de INotifyCollectionChanged) são atómicas; nenhum acesso de outros threads pode intervir. (Isto é normalmente gratuito. Por exemplo, ObservableCollection<T> garante isto, desde que todas as alterações estejam protegidas por sincronização.)
Se chamares DisableCollectionSynchronization, essa chamada também tem de ocorrer no tópico da interface.
Se quiseres usar a mesma coleção em múltiplos threads UI, deves chamar EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessário) separadamente em cada thread UI.
Evita o impasse. Esta já é responsabilidade da aplicação uma vez que esta opta por usar a sincronização, mas também deve ter em conta a participação do WPF na sincronização, como discutido no parágrafo seguinte.
Em troca, o WPF fornece o seguinte comportamento:
Acede CollectionView à coleção usando o mecanismo de sincronização indicado.
O CollectionView mantém uma "cópia sombra" da coleção para uso no tópico da interface.
CollectionChanged Os eventos são alinhados à medida que chegam (em qualquer tópico).
Os eventos pendentes são aplicados à cópia sombra de forma assíncrona no tópico da interface quando esta tem oportunidade de o fazer.
Eles CollectionView não usam diretamente nenhum outro mecanismo de sincronização visível para a aplicação. Esta é a forma da WPF ajudar a evitar o impasse (ver o item anterior 7).
O efeito líquido é que podes alterar a coleção em qualquer tópico, e essas alterações acabam por aparecer quando ItemsControl o tópico da interface tem tempo para "recuperar o atraso". A implementação foi ajustada para reduzir a velocidade com que as mudanças fluem para a thread da interface, para evitar que threads em segundo plano saturem a thread e privem a resposta à entrada normal do utilizador.
EnableCollectionSynchronization(IEnumerable, Object)
Permite que um CollectionView objeto participe num acesso sincronizado a uma coleção usada em múltiplos threads usando um mecanismo simples de bloqueio.
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)
Parâmetros
- collection
- IEnumerable
A coleção que precisa de acesso sincronizado.
- lockObject
- Object
O objeto a bloquear ao aceder à coleção.
Observações
Uma aplicação WPF pode exibir uma coleção de dados usando um ItemsControl ou uma das suas subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo o seu acesso à coleção através de uma subclasse de CollectionView. Tanto o ItemsControl como o CollectionView têm afinidade com o fio em que o ItemsControl foi criado, o que significa que usá-los num fio diferente é proibido e cria uma exceção. Na prática, esta restrição aplica-se também à coleção.
Podes querer usar a coleção em vários threads. Por exemplo, deve atualizar a coleção (adicionar ou remover itens) num tópico de "recolha de dados", enquanto exibe os resultados num tópico de "interface de utilizador", para que a interface se mantenha responsiva durante a recolha de dados. Nessa situação, é responsável por garantir o acesso sincronizado ("thread-safe") à coleção e por garantir que o acesso de WPF (especificamente de CollectionView) participe no mesmo mecanismo de sincronização. Ao chamar o EnableCollectionSynchronization(IEnumerable, Object) método, pode fazê-lo usando um mecanismo simples de bloqueio.
Para usar uma coleção em múltiplos threads, um dos quais é o thread da interface que detém o ItemsControl, deve fazer o seguinte:
Instância de um objeto para bloquear ao aceder à coleção.
Sincroniza todos os acessos da aplicação para a coleção bloqueando esse objeto.
Ligue para EnableCollectionSynchronization(IEnumerable, Object) para informar WPF que está a usar um mecanismo de fechadura simples.
A chamada deve ocorrer no tópico da interface.
A chamada deve ocorrer antes de usar a coleção numa thread diferente ou antes de anexar a coleção à ItemsControl, o que ocorrer mais tarde.
Assegure que uma alteração na coleção e a notificação dessa alteração (através de INotifyCollectionChanged) são atómicas; nenhum acesso de outros threads pode intervir. (Isto é normalmente gratuito. Por exemplo, ObservableCollection<T> garante isto, desde que todas as alterações estejam protegidas por sincronização.)
Se chamares DisableCollectionSynchronization, essa chamada também tem de ocorrer no tópico da interface.
Se quiseres usar a mesma coleção em múltiplos threads UI, deves chamar EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessário) separadamente em cada thread UI.
Evita o impasse. Esta já é responsabilidade da aplicação assim que esta decide usar a sincronização, mas também deve ter em conta a participação do WPF na sincronização. (Ver mais abaixo.)
Em troca, o WPF fornece o seguinte comportamento:
Acede CollectionView à coleção usando o mecanismo de bloqueio.
O CollectionView mantém uma "cópia sombra" da coleção para uso no tópico da interface.
CollectionChanged Os eventos são alinhados à medida que chegam (em qualquer tópico).
Os eventos pendentes são aplicados à cópia sombra de forma assíncrona no tópico da interface quando esta tem oportunidade de o fazer.
Não CollectionView utilizam diretamente nenhum outro mecanismo de sincronização visível para a aplicação. Esta é a forma da WPF ajudar a evitar o impasse (ver o item anterior 7).
O efeito líquido é que podes alterar a coleção em qualquer tópico, e essas alterações acabam por aparecer quando ItemsControl o tópico da interface tem tempo para "recuperar o atraso". A implementação foi ajustada para reduzir a velocidade com que as mudanças fluem para a thread da interface, para evitar que threads em segundo plano saturem a thread e privem a resposta à entrada normal do utilizador.
Aplica-se a
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
Permite que um CollectionView objeto participe em acesso sincronizado a uma coleção usada em múltiplos threads usando um mecanismo diferente de um simples bloqueio.
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)
Parâmetros
- collection
- IEnumerable
A coleção que precisa de acesso sincronizado.
- context
- Object
Um objeto que é passado para o callback.
- synchronizationCallback
- CollectionSynchronizationCallback
O callback que é invocado sempre que é necessário acesso à coleção. Pode usá-lo para garantir que a coleção é acedida por um thread de cada vez.
Observações
Uma aplicação WPF pode exibir uma coleção de dados usando um ItemsControl ou uma das suas subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo o seu acesso à coleção através de uma subclasse de CollectionView. Tanto o ItemsControl como o CollectionView têm afinidade com o fio em que o ItemsControl foi criado, o que significa que usá-los num fio diferente é proibido e cria uma exceção. Na prática, esta restrição aplica-se também à coleção.
Podes querer usar a coleção em vários threads. Por exemplo, deve atualizar a coleção (adicionar ou remover itens) num tópico de "recolha de dados", enquanto exibe os resultados num tópico de "interface de utilizador", para que a interface se mantenha responsiva durante a recolha de dados. Nessa situação, é responsável por garantir o acesso sincronizado ("thread-safe") à coleção e por garantir que o acesso de WPF (especificamente de CollectionView) participe no mesmo mecanismo de sincronização. Ao chamar o EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) método, pode fazê-lo usando um mecanismo de sincronização, como um semáforo, um evento de reset, etc.
Para usar uma coleção em múltiplos threads, um dos quais é o thread da interface que detém o ItemsControl, deve fazer o seguinte:
Escolha um mecanismo de sincronização.
Sincronize todos os acessos da aplicação para a coleção usando esse mecanismo.
Liga para a sobrecarga EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) para informar WPF que estás a usar um mecanismo diferente do bloqueio simples.
A chamada deve ocorrer no tópico da interface.
A chamada deve ocorrer antes de usar a coleção numa thread diferente ou antes de anexar a coleção à ItemsControl, o que ocorrer mais tarde.
Assegure que uma alteração na coleção e a notificação dessa alteração (através de INotifyCollectionChanged) são atómicas; nenhum acesso de outros threads pode intervir. (Isto é normalmente gratuito. Por exemplo, ObservableCollection<T> garante isto, desde que todas as alterações estejam protegidas por sincronização.)
Se chamares DisableCollectionSynchronization, essa chamada também tem de ocorrer no tópico da interface.
Se quiseres usar a mesma coleção em múltiplos threads UI, deves chamar EnableCollectionSynchronization (e DisableCollectionSynchronization, se necessário) separadamente em cada thread UI.
Evita o impasse. Esta já é responsabilidade da aplicação assim que esta decide usar a sincronização, mas também deve ter em conta a participação do WPF na sincronização. (Ver mais abaixo.)
Em troca, o WPF fornece o seguinte comportamento:
Acede CollectionView à coleção chamando o registado CollectionSynchronizationCallback com os seguintes argumentos:
-
collection: a coleção de interessos. -
context: o objeto de contexto registado. -
accessMethod: um delegado que realiza o acesso efetivo. -
writeAccess:truese o delegado modificar a coleção;falsecaso contrário.
CollectionSynchronizationCallback Deves estabelecer a sincronização na coleção (usando o
contextobjeto e owriteAccessvalor, conforme apropriado), chamar oaccessMethod, e depois libertar a sincronização.-
O CollectionView mantém uma "cópia sombra" da coleção para uso no tópico da interface.
CollectionChanged Os eventos são alinhados à medida que chegam (em qualquer tópico).
Os eventos pendentes são aplicados à cópia sombra de forma assíncrona no tópico da interface quando esta tem oportunidade de o fazer.
Não CollectionView utilizam diretamente nenhum outro mecanismo de sincronização visível para a aplicação. Esta é a forma da WPF ajudar a evitar o impasse (ver o item anterior 7).
O efeito líquido é que podes alterar a coleção em qualquer tópico, e essas alterações acabam por aparecer quando ItemsControl o tópico da interface tem tempo para "recuperar o atraso". A implementação foi ajustada para reduzir a velocidade com que as mudanças fluem para a thread da interface, para evitar que threads em segundo plano saturem a thread e privem a resposta à entrada normal do utilizador.
O context parâmetro é um objeto arbitrário que é passado ao callback. Pode usá-lo para determinar o mecanismo de sincronização usado para controlar o acesso a collection.
Context pode ser null.