BindingOperations.EnableCollectionSynchronization Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Permite que un CollectionView objeto participe en el acceso sincronizado a una colección que se usa en varios subprocesos.
Sobrecargas
| Nombre | Description |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
Permite que un CollectionView objeto participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo de bloqueo simple. |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
Permite que un CollectionView objeto participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo distinto de un bloqueo simple. |
Comentarios
Una aplicación de WPF puede mostrar una colección de datos mediante un ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo su acceso a la colección a través de una subclase de CollectionView. Tanto como ItemsControl tienen CollectionView afinidad con el subproceso en el que se creó, ItemsControl lo que significa que su uso en un subproceso diferente está prohibido y produce una excepción. En efecto, esta restricción también se aplica a la colección.
Es posible que quiera usar la colección en varios subprocesos. Por ejemplo, quiere actualizar la colección (agregar o quitar elementos) en un subproceso "recopilación de datos", al tiempo que muestra los resultados en un subproceso de "interfaz de usuario", de modo que la interfaz de usuario siga respondiendo mientras se está produciendo la recopilación de datos. En tal situación, usted es responsable de garantizar el acceso sincronizado ("seguro para subprocesos") a la colección. Esto suele hacerse mediante un mecanismo de bloqueo simple o un mecanismo de sincronización más elaborado, como semáforos, eventos de restablecimiento, etc.
Aunque debe sincronizar el acceso de la aplicación a la colección, también debe garantizar que el acceso desde WPF (específicamente desde CollectionView) participe en el mismo mecanismo de sincronización. Para ello, llame al EnableCollectionSynchronization método .
Para usar una colección en varios subprocesos, uno de los cuales es el subproceso de interfaz de usuario que posee ItemsControl, una aplicación tiene las siguientes responsabilidades:
Elija un mecanismo de sincronización.
Sincronice todo el acceso desde la aplicación a la colección mediante ese mecanismo.
Llame a EnableCollectionSynchronization para informar WPF del mecanismo.
La llamada debe producirse en el subproceso de la interfaz de usuario.
La llamada debe producirse antes de usar la colección en un subproceso diferente o antes de adjuntar la colección a ItemsControl, lo que sea más adelante.
Llame a la EnableCollectionSynchronization(IEnumerable, Object) sobrecarga si usa un mecanismo de bloqueo simple; llame a la EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) sobrecarga si usa un mecanismo más elaborado.
Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) son atómicos; ningún acceso desde otros subprocesos puede intervenir. (Esto suele ser gratuito. Por ejemplo, ObservableCollection<T> garantiza esto, siempre que todos los cambios estén protegidos por sincronización).
Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.
Si desea usar la misma colección en varios subprocesos de interfaz de usuario, debe llamar EnableCollectionSynchronization a (y DisableCollectionSynchronization, si es necesario) por separado en cada subproceso de interfaz de usuario.
Evite interbloqueo. Esto ya es responsabilidad de la aplicación una vez que decide usar la sincronización, pero también debe tener en cuenta la participación de WPF en la sincronización, como se describe en el párrafo siguiente.
A cambio, WPF proporciona el siguiente comportamiento:
Obtiene CollectionView acceso a la colección mediante el mecanismo de sincronización especificado.
CollectionView mantiene una "instantánea" de la colección para su uso en el subproceso de la interfaz de usuario.
CollectionChanged los eventos se ponen en cola a medida que llegan (en cualquier subproceso).
Los eventos pendientes se aplican a la instantánea de forma asincrónica en el subproceso de la interfaz de usuario cuando tiene la oportunidad de hacerlo.
No CollectionView usará directamente ningún otro mecanismo de sincronización visible para la aplicación. Esto es WPF manera de ayudar a evitar interbloqueo (véase el elemento 7 anterior).
El efecto neto es que puede cambiar la colección en cualquier subproceso y esos cambios aparecen finalmente en cuando ItemsControl el subproceso de la interfaz de usuario tiene tiempo para "ponerse al día". La implementación se ha optimizado para limitar la velocidad que cambia el flujo al subproceso de la interfaz de usuario para evitar que los subprocesos en segundo plano saturan el subproceso de la interfaz de usuario y se agote la respuesta a la entrada normal del usuario.
EnableCollectionSynchronization(IEnumerable, Object)
Permite que un CollectionView objeto participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo de bloqueo simple.
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
Colección que necesita acceso sincronizado.
- lockObject
- Object
Objeto que se va a bloquear al acceder a la colección.
Comentarios
Una aplicación de WPF puede mostrar una colección de datos mediante un ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo su acceso a la colección a través de una subclase de CollectionView. Tanto como ItemsControl tienen CollectionView afinidad con el subproceso en el que se creó, ItemsControl lo que significa que su uso en un subproceso diferente está prohibido y produce una excepción. En efecto, esta restricción también se aplica a la colección.
Es posible que quiera usar la colección en varios subprocesos. Por ejemplo, quiere actualizar la colección (agregar o quitar elementos) en un subproceso "recopilación de datos", al tiempo que muestra los resultados en un subproceso de "interfaz de usuario", de modo que la interfaz de usuario siga respondiendo mientras se está produciendo la recopilación de datos. En tal situación, usted es responsable de garantizar el acceso sincronizado ("seguro para subprocesos") a la colección y para garantizar que el acceso desde WPF (específicamente desde CollectionView) participa en el mismo mecanismo de sincronización. Al llamar al EnableCollectionSynchronization(IEnumerable, Object) método , puede hacerlo mediante un mecanismo de bloqueo simple.
Para usar una colección en varios subprocesos, uno de los cuales es el subproceso ItemsControlde interfaz de usuario que posee , debe hacer lo siguiente:
Cree una instancia de un objeto que se va a bloquear al acceder a la colección.
Sincronice todo el acceso desde la aplicación a la colección bloqueando ese objeto.
Llame a EnableCollectionSynchronization(IEnumerable, Object) para informar a WPF que usa un mecanismo de bloqueo simple.
La llamada debe producirse en el subproceso de la interfaz de usuario.
La llamada debe producirse antes de usar la colección en un subproceso diferente o antes de adjuntar la colección a ItemsControl, lo que sea más adelante.
Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) son atómicos; ningún acceso desde otros subprocesos puede intervenir. (Esto suele ser gratuito. Por ejemplo, ObservableCollection<T> garantiza esto, siempre que todos los cambios estén protegidos por sincronización).
Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.
Si desea usar la misma colección en varios subprocesos de interfaz de usuario, debe llamar EnableCollectionSynchronization a (y DisableCollectionSynchronization, si es necesario) por separado en cada subproceso de interfaz de usuario.
Evite interbloqueo. Esto ya es responsabilidad de la aplicación una vez que decide usar la sincronización, pero también debe tener en cuenta la participación de WPF en la sincronización. (Vea más, a continuación).
A cambio, WPF proporciona el siguiente comportamiento:
Obtiene CollectionView acceso a la colección mediante el mecanismo de bloqueo.
CollectionView mantiene una "instantánea" de la colección para su uso en el subproceso de la interfaz de usuario.
CollectionChanged los eventos se ponen en cola a medida que llegan (en cualquier subproceso).
Los eventos pendientes se aplican a la instantánea de forma asincrónica en el subproceso de la interfaz de usuario cuando tiene la oportunidad de hacerlo.
No CollectionView usará directamente ningún otro mecanismo de sincronización visible para la aplicación. Esto es WPF manera de ayudar a evitar interbloqueo (véase el elemento 7 anterior).
El efecto neto es que puede cambiar la colección en cualquier subproceso y esos cambios aparecen finalmente en cuando ItemsControl el subproceso de la interfaz de usuario tiene tiempo para "ponerse al día". La implementación se ha optimizado para limitar la velocidad que cambia el flujo al subproceso de la interfaz de usuario para evitar que los subprocesos en segundo plano saturan el subproceso de la interfaz de usuario y se agote la respuesta a la entrada normal del usuario.
Se aplica a
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
Permite que un CollectionView objeto participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo distinto de un bloqueo simple.
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
Colección que necesita acceso sincronizado.
- context
- Object
Objeto que se pasa a la devolución de llamada.
- synchronizationCallback
- CollectionSynchronizationCallback
Devolución de llamada que se invoca cada vez que se requiere acceso a la colección. Puede usarlo para asegurarse de que un subproceso tiene acceso a la colección a la vez.
Comentarios
Una aplicación de WPF puede mostrar una colección de datos mediante un ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canaliza todo su acceso a la colección a través de una subclase de CollectionView. Tanto como ItemsControl tienen CollectionView afinidad con el subproceso en el que se creó, ItemsControl lo que significa que su uso en un subproceso diferente está prohibido y produce una excepción. En efecto, esta restricción también se aplica a la colección.
Es posible que quiera usar la colección en varios subprocesos. Por ejemplo, quiere actualizar la colección (agregar o quitar elementos) en un subproceso "recopilación de datos", al tiempo que muestra los resultados en un subproceso de "interfaz de usuario", de modo que la interfaz de usuario siga respondiendo mientras se está produciendo la recopilación de datos. En tal situación, usted es responsable de garantizar el acceso sincronizado ("seguro para subprocesos") a la colección y para garantizar que el acceso desde WPF (específicamente desde CollectionView) participa en el mismo mecanismo de sincronización. Al llamar al EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) método , puede hacerlo mediante un mecanismo de sincronización, como un semáforo, un evento de restablecimiento, etc.
Para usar una colección en varios subprocesos, uno de los cuales es el subproceso ItemsControlde interfaz de usuario que posee , debe hacer lo siguiente:
Elija un mecanismo de sincronización.
Sincronice todo el acceso desde la aplicación a la colección mediante ese mecanismo.
Llame a la sobrecarga EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) para informar a WPF que usa un mecanismo que no sea el bloqueo simple.
La llamada debe producirse en el subproceso de la interfaz de usuario.
La llamada debe producirse antes de usar la colección en un subproceso diferente o antes de adjuntar la colección a ItemsControl, lo que sea más adelante.
Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) son atómicos; ningún acceso desde otros subprocesos puede intervenir. (Esto suele ser gratuito. Por ejemplo, ObservableCollection<T> garantiza esto, siempre que todos los cambios estén protegidos por sincronización).
Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.
Si desea usar la misma colección en varios subprocesos de interfaz de usuario, debe llamar EnableCollectionSynchronization a (y DisableCollectionSynchronization, si es necesario) por separado en cada subproceso de interfaz de usuario.
Evite interbloqueo. Esto ya es responsabilidad de la aplicación una vez que decide usar la sincronización, pero también debe tener en cuenta la participación de WPF en la sincronización. (Vea más, a continuación).
A cambio, WPF proporciona el siguiente comportamiento:
Obtiene CollectionView acceso a la colección llamando al registrado CollectionSynchronizationCallback con los argumentos siguientes:
-
collection: colección de interés. -
context: el objeto de contexto registrado. -
accessMethod: delegado que realiza el acceso real. -
writeAccess:truesi el delegado modificará la colección;falsede lo contrario, .
Debe CollectionSynchronizationCallback establecer la sincronización en la colección (mediante el
contextobjeto y elwriteAccessvalor, según corresponda), llame aaccessMethody, a continuación, libere la sincronización.-
CollectionView mantiene una "instantánea" de la colección para su uso en el subproceso de la interfaz de usuario.
CollectionChanged los eventos se ponen en cola a medida que llegan (en cualquier subproceso).
Los eventos pendientes se aplican a la instantánea de forma asincrónica en el subproceso de la interfaz de usuario cuando tiene la oportunidad de hacerlo.
No CollectionView usará directamente ningún otro mecanismo de sincronización visible para la aplicación. Esto es WPF manera de ayudar a evitar interbloqueo (véase el elemento 7 anterior).
El efecto neto es que puede cambiar la colección en cualquier subproceso y esos cambios aparecen finalmente en cuando ItemsControl el subproceso de la interfaz de usuario tiene tiempo para "ponerse al día". La implementación se ha optimizado para limitar la velocidad que cambia el flujo al subproceso de la interfaz de usuario para evitar que los subprocesos en segundo plano saturan el subproceso de la interfaz de usuario y se agote la respuesta a la entrada normal del usuario.
El context parámetro es un objeto arbitrario que se pasa a .callback Puede usarlo para determinar el mecanismo de sincronización usado para controlar el acceso a collection.
Context puede ser null.