Compartir a través de


BindingOperations.EnableCollectionSynchronization Método

Definición

Permite que un objeto CollectionView participe en el acceso sincronizado a una colección que se usa en varios subprocesos.

Sobrecargas

EnableCollectionSynchronization(IEnumerable, Object)

Permite que un objeto CollectionView participe en el acceso sincronizado a una colección que se usa en varios subprocesos mediante un mecanismo sencillo de bloqueo.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Permite que un objeto CollectionView participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo distinto a un bloqueo sencillo.

Comentarios

Una aplicación WPF puede mostrar una colección de datos mediante una ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canalifica todo su acceso a la colección a través de una subclase de CollectionView. Tanto y ItemsControlCollectionView tienen afinidad con el subproceso en el ItemsControl que se creó , 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 de "recopilación de datos", mientras se muestran los resultados en un subproceso de "interfaz de usuario", para que la interfaz de usuario siga respondiendo mientras se producen recopilaciones 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.  Puede hacerlo llamando al método EnableCollectionSynchronization.

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:

  1. Elija un mecanismo de sincronización.

  2. Sincronice todo el acceso desde la aplicación a la colección mediante ese mecanismo.

  3. Llame EnableCollectionSynchronization a para informar a WPF del mecanismo.

  4. Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) sean 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).

  5. Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.

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

  7. Evite el interbloqueo.  Esta 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:

  • CollectionView Obtiene 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. Esta es la forma de WPF de ayudar a evitar interbloqueos (vea 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 interfaz de usuario tiene tiempo para "ponerse al día".  La implementación se ha ajustado 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 objeto CollectionView participe en el acceso sincronizado a una colección que se usa en varios subprocesos mediante un mecanismo sencillo de bloqueo.

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 obtener acceso sincronizado.

lockObject
Object

Objeto que se va a bloquear al acceder a la colección.

Comentarios

Una aplicación WPF puede mostrar una colección de datos mediante una ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canalifica todo su acceso a la colección a través de una subclase de CollectionView. Tanto y ItemsControlCollectionView tienen afinidad con el subproceso en el ItemsControl que se creó , 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 de "recopilación de datos", mientras se muestran los resultados en un subproceso de "interfaz de usuario", para que la interfaz de usuario siga respondiendo mientras se producen recopilaciones 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 de CollectionView) participa en el mismo mecanismo de sincronización. Mediante una llamada 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:

  1. Cree una instancia de un objeto que se bloqueará al obtener acceso a la colección.

  2. Sincronice todo el acceso desde la aplicación a la colección bloqueando ese objeto.

  3. Llame EnableCollectionSynchronization(IEnumerable, Object) a para informar a WPF de que está usando 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.

  4. Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) son atómicos; no puede intervenir ningún acceso desde otros subprocesos.  (Esto suele ser gratuito. Por ejemplo, ObservableCollection<T> garantiza esto, siempre que todos los cambios estén protegidos por sincronización).

  5. Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.

  6. Si quiere usar la misma colección en varios subprocesos de interfaz de usuario, debe llamar a EnableCollectionSynchronization (y DisableCollectionSynchronization, si es necesario) por separado en cada subproceso de interfaz de usuario.

  7. Evite interbloqueo.  Esto ya es responsabilidad de la aplicación una vez que decida usar la sincronización, pero también debe tener en cuenta la participación de WPF en la sincronización. (Vea más abajo).

A cambio, WPF proporciona el siguiente comportamiento:

  • CollectionView Obtiene 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 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. Esta es la manera de WPF de ayudar a evitar interbloqueos (vea 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 interfaz de usuario tiene tiempo para "ponerse al día".  La implementación se ha ajustado 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 agote la respuesta a la entrada normal del usuario.

Se aplica a

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Permite que un objeto CollectionView participe en el acceso sincronizado a una colección usada en varios subprocesos mediante un mecanismo distinto a un bloqueo sencillo.

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 obtener acceso sincronizado.

context
Object

Objeto que se pasa a la devolución de llamada.

synchronizationCallback
CollectionSynchronizationCallback

Devolución de llamada que se invoca cuando se requiere acceso a la colección. Puede usarla para asegurarse de que los subprocesos accedan a la colección de uno en uno.

Comentarios

Una aplicación WPF puede mostrar una colección de datos mediante una ItemsControl o una de sus subclases (ListBox, DataGrid, TreeView, ListView, etc.). WPF canalifica todo su acceso a la colección a través de una subclase de CollectionView. Tanto y ItemsControlCollectionView tienen afinidad con el subproceso en el ItemsControl que se creó , 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 de "recopilación de datos", mientras se muestran los resultados en un subproceso de "interfaz de usuario", para que la interfaz de usuario siga respondiendo mientras se producen recopilaciones 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 de 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 semáforos, 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:

  1. Elija un mecanismo de sincronización.

  2. Sincronice todo el acceso desde la aplicación a la colección mediante ese mecanismo.

  3. Llame a la EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) sobrecarga para informar a WPF de 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.

  4. Asegúrese de que un cambio en la colección y la notificación de ese cambio (a través INotifyCollectionChangedde ) son atómicos; no puede intervenir ningún acceso desde otros subprocesos.  (Esto suele ser gratuito. Por ejemplo, ObservableCollection<T> garantiza esto, siempre que todos los cambios estén protegidos por sincronización).

  5. Si llama a DisableCollectionSynchronization, esa llamada también debe producirse en el subproceso de la interfaz de usuario.

  6. Si quiere usar la misma colección en varios subprocesos de interfaz de usuario, debe llamar a EnableCollectionSynchronization (y DisableCollectionSynchronization, si es necesario) por separado en cada subproceso de interfaz de usuario.

  7. Evite interbloqueo.  Esto ya es responsabilidad de la aplicación una vez que decida usar la sincronización, pero también debe tener en cuenta la participación de WPF en la sincronización. (Vea más abajo).

A cambio, WPF proporciona el siguiente comportamiento:

  • Obtiene CollectionView acceso a la colección mediante una llamada al objeto 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: true si el delegado modificará la colección; false de lo contrario, .

    Debe CollectionSynchronizationCallback establecer la sincronización en la colección (mediante el context objeto y el writeAccess valor, según corresponda), llame a y, a continuación, libere la accessMethodsincronización.

  • CollectionView mantiene una "instantánea" de la colección para su uso en el subproceso de 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. Esta es la manera de WPF de ayudar a evitar interbloqueos (vea 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 interfaz de usuario tiene tiempo para "ponerse al día".  La implementación se ha ajustado 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 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 que se usa para controlar el acceso a collection. Context puede ser null.

Se aplica a