BindingOperations.EnableCollectionSynchronization Methode

Definition

Ermöglicht es einem CollectionView-Objekt, an einem synchronisierten Zugriff auf eine Auflistung teilzunehmen, die in mehreren Threads verwendet wird.

Überlädt

EnableCollectionSynchronization(IEnumerable, Object)

Ermöglicht es einem CollectionView-Objekt durch einen einfachen Sperrmechanismus, an einem synchronisierten Zugriff auf eine Auflistung teilzunehmen, die von mehreren Threads verwendet wird.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Ermöglicht es einem CollectionView-Objekt durch einen anderen Mechanismus als eine einfache Sperre, an einem synchronisierten Zugriff auf eine Auflistung teilzunehmen, die von mehreren Threads verwendet wird.

Hinweise

Eine WPF-Anwendung kann eine Auflistung von Daten mit Anzeigen einer ItemsControl oder eine ihrer Unterklassen (ListBox, DataGrid, TreeView, ListViewusw.). WPF kanalt den gesamten Zugriff auf die Auflistung über eine Unterklasse von CollectionView. Sowohl die ItemsControl als auch die CollectionView haben Affinität zu dem Thread, für den erstellt ItemsControl wurde, was bedeutet, dass die Verwendung in einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt in der Tat auch für die Sammlung.

Möglicherweise möchten Sie die Auflistung für mehrere Threads verwenden.   Sie möchten z. B. die Sammlung in einem "Datensammlungsthread" aktualisieren (Elemente hinzufügen oder entfernen), während die Ergebnisse in einem "Benutzeroberfläche"-Thread angezeigt werden, sodass die Benutzeroberfläche während der Datensammlung reaktionsfähig bleibt. In einer solchen Situation sind Sie dafür verantwortlich, den synchronisierten ("threadsicheren") Zugriff auf die Sammlung sicherzustellen.   Dies erfolgt in der Regel mit einer einfachen Sperrmechanismus oder einen komplexeren Synchronisierungsmechanismus wie Semaphoren, zurücksetzen, Ereignisse usw.

Während Sie den Zugriff Ihrer Anwendung auf die Sammlung synchronisieren müssen, müssen Sie auch sicherstellen, dass der Zugriff von WPF (insbesondere von CollectionView) an demselben Synchronisierungsmechanismus beteiligt ist.  Hierfür rufen Sie die EnableCollectionSynchronization-Methode auf.

Um eine Sammlung für mehrere Threads zu verwenden, von denen einer der BENUTZEROBERFLÄCHENthread ist, der das ItemsControlbesitzt, hat eine Anwendung die folgenden Aufgaben:

  1. Wählen Sie einen Synchronisierungsmechanismus aus.

  2. Synchronisieren Sie den gesamten Zugriff von der Anwendung mit der Sammlung mithilfe dieses Mechanismus.

  3. Rufen Sie auf EnableCollectionSynchronization , um WPF über den Mechanismus zu informieren.

  4. Stellen Sie sicher, dass eine Änderung an der Auflistung und die Benachrichtigung über diese Änderung (bis INotifyCollectionChanged) atomar sind; kein Zugriff von anderen Threads kann eingreifen.  (Dies ist in der Regel kostenlos. Für instance ObservableCollection<T> garantiert dies, sofern alle Änderungen durch Synchronisierung geschützt sind.)

  5. Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.

  6. Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie (und DisableCollectionSynchronization, falls erforderlich) separat für jeden UI-Thread aufrufen EnableCollectionSynchronization .

  7. Vermeiden Sie Einen Deadlock.  Dies liegt bereits in der Verantwortung der Anwendung, sobald sie sich für die Verwendung der Synchronisierung entscheidet, aber sie muss auch die Beteiligung von WPF an der Synchronisierung berücksichtigen, wie im folgenden Absatz erläutert.

Im Gegenzug bietet WPF das folgende Verhalten:

  • Der CollectionView greift mithilfe des angegebenen Synchronisierungsmechanismus auf die Auflistung zu.

  • Der CollectionView verwaltet eine "Schattenkopie" der Auflistung zur Verwendung im UI-Thread.

  • CollectionChanged Ereignisse werden beim Eintreffen (in einem beliebigen Thread) in die Warteschlange gestellt.

  • Ausstehende Ereignisse werden asynchron auf die Schattenkopie auf den UI-Thread angewendet, wenn die Möglichkeit dazu vorhanden ist.

  • Der CollectionView verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Auf diese Weise trägt WPF dazu bei, Deadlocks zu vermeiden (siehe vorheriger Punkt 7).  

Der Nettoeffekt besteht darin, dass Sie die Auflistung für einen beliebigen Thread ändern können, und diese Änderungen werden schließlich in dem ItemsControl angezeigt, wenn der UI-Thread Zeit zum "Aufholen" hat.  Die Implementierung wurde optimiert, um die Rate zu drosseln, die Änderungen in den UI-Thread fließen, damit Hintergrundthreads den UI-Thread nicht überlasten und die Antwort auf normale Benutzereingaben aushungern.

EnableCollectionSynchronization(IEnumerable, Object)

Ermöglicht es einem CollectionView-Objekt durch einen einfachen Sperrmechanismus, an einem synchronisierten Zugriff auf eine Auflistung teilzunehmen, die von mehreren Threads verwendet wird.

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)

Parameter

collection
IEnumerable

Die Auflistung, die synchronisierten Zugriff benötigt.

lockObject
Object

Das beim Zugriff auf die Auflistung zu sperrende Objekt.

Hinweise

Eine WPF-Anwendung kann eine Auflistung von Daten mit Anzeigen einer ItemsControl oder eine ihrer Unterklassen (ListBox, DataGrid, TreeView, ListViewusw.). WPF kanalt den gesamten Zugriff auf die Auflistung über eine Unterklasse von CollectionView. Sowohl die ItemsControl als auch die CollectionView haben Affinität zu dem Thread, für den erstellt ItemsControl wurde, was bedeutet, dass die Verwendung in einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt in der Tat auch für die Sammlung.

Möglicherweise möchten Sie die Auflistung für mehrere Threads verwenden.   Sie möchten z. B. die Sammlung in einem "Datensammlungsthread" aktualisieren (Elemente hinzufügen oder entfernen), während die Ergebnisse in einem "Benutzeroberfläche"-Thread angezeigt werden, sodass die Benutzeroberfläche während der Datensammlung reaktionsfähig bleibt. In einer solchen Situation sind Sie dafür verantwortlich, den synchronisierten ("threadsicheren") Zugriff auf die Sammlung sicherzustellen und sicherzustellen, dass der Zugriff von WPF (insbesondere von CollectionView) an demselben Synchronisierungsmechanismus teilnimmt. Wenn Sie die EnableCollectionSynchronization(IEnumerable, Object) -Methode aufrufen, können Sie dazu einen einfachen Sperrmechanismus verwenden.

Um eine Auflistung für mehrere Threads zu verwenden, von denen einer der UI-Thread ist, der den ItemsControlbesitzt, müssen Sie die folgenden Schritte ausführen:

  1. Instanziieren Sie ein Objekt, das beim Zugriff auf die Auflistung gesperrt werden soll.

  2. Synchronisieren Sie den gesamten Zugriff von der Anwendung mit der Auflistung, indem Sie dieses Objekt sperren.

  3. Rufen Sie auf EnableCollectionSynchronization(IEnumerable, Object) , um WPF darüber zu informieren, dass Sie einen einfachen Sperrmechanismus verwenden.

    • Der Aufruf muss im UI-Thread erfolgen.

    • Der Aufruf muss vor der Verwendung der Auflistung in einem anderen Thread oder vor dem Anfügen der -Auflistung erfolgen ItemsControl, je nachdem, was später ist.

  4. Stellen Sie sicher, dass eine Änderung an der Auflistung und die Benachrichtigung über diese Änderung (bis INotifyCollectionChanged) atomar sind. Der Zugriff von anderen Threads kann nicht eingreifen.  (Dies ist in der Regel kostenlos. Für instance ObservableCollection<T> garantiert dies, vorausgesetzt, dass alle Änderungen durch Synchronisierung geschützt sind.)

  5. Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.

  6. Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie (und DisableCollectionSynchronization, falls erforderlich) separat für jeden UI-Thread aufrufen EnableCollectionSynchronization .

  7. Vermeiden Sie einen Deadlock.  Dies liegt bereits in der Verantwortung der Anwendung, sobald sie sich für die Verwendung der Synchronisierung entscheidet, aber sie muss auch die Beteiligung von WPF an der Synchronisierung berücksichtigen. (Weitere Informationen finden Sie weiter unten.)

Im Gegenzug bietet WPF das folgende Verhalten:

  • Der CollectionView greift mithilfe des Sperrmechanismus auf die Auflistung zu.

  • Verwaltet CollectionView eine "Schattenkopie" der Auflistung zur Verwendung im UI-Thread.

  • CollectionChanged Ereignisse werden beim Eintreffen (in einem beliebigen Thread) in die Warteschlange eingereiht.

  • Ausstehende Ereignisse werden asynchron auf die Schattenkopie im UI-Thread angewendet, wenn die Möglichkeit dazu vorhanden ist.

  • Der CollectionView verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Dies ist die Möglichkeit von WPF, einen Deadlock zu vermeiden (siehe vorheriger Artikel 7).  

Der Nettoeffekt besteht darin, dass Sie die Sammlung für jeden Thread ändern können, und diese Änderungen werden schließlich in der ItemsControl angezeigt, wenn der UI-Thread Zeit zum "Aufholen" hat.  Die Implementierung wurde optimiert, um die Rate zu drosseln, mit der Änderungen in den UI-Thread fließen, damit Hintergrundthreads den UI-Thread nicht überlasten und die Antwort auf normale Benutzereingaben verhungern.

Gilt für:

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Ermöglicht es einem CollectionView-Objekt durch einen anderen Mechanismus als eine einfache Sperre, an einem synchronisierten Zugriff auf eine Auflistung teilzunehmen, die von mehreren Threads verwendet wird.

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)

Parameter

collection
IEnumerable

Die Auflistung, die synchronisierten Zugriff benötigt.

context
Object

Ein Objekt, das an den Rückruf übergeben wird.

synchronizationCallback
CollectionSynchronizationCallback

Der Rückruf, der aufgerufen wird, wenn der Zugriff auf die Auflistung erforderlich ist. Sie können diesen verwenden, um sicherzustellen, dass die Auflistung nur von einem Thread gleichzeitig verwendet wird.

Hinweise

Eine WPF-Anwendung kann eine Auflistung von Daten mit Anzeigen einer ItemsControl oder eine ihrer Unterklassen (ListBox, DataGrid, TreeView, ListViewusw.). WPF kanalt den gesamten Zugriff auf die Auflistung über eine Unterklasse von CollectionView. Sowohl die ItemsControl als auch die CollectionView haben Affinität zu dem Thread, für den erstellt ItemsControl wurde, was bedeutet, dass die Verwendung in einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt in der Tat auch für die Sammlung.

Möglicherweise möchten Sie die Auflistung für mehrere Threads verwenden.   Sie möchten z. B. die Sammlung in einem "Datensammlungsthread" aktualisieren (Elemente hinzufügen oder entfernen), während die Ergebnisse in einem "Benutzeroberfläche"-Thread angezeigt werden, sodass die Benutzeroberfläche während der Datensammlung reaktionsfähig bleibt. In einer solchen Situation sind Sie dafür verantwortlich, den synchronisierten ("threadsicheren") Zugriff auf die Sammlung sicherzustellen und sicherzustellen, dass der Zugriff von WPF (insbesondere von CollectionView) an demselben Synchronisierungsmechanismus teilnimmt. Durch Aufrufen der EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) -Methode, Sie können dazu einen Synchronisierungsmechanismus, z. B. eine Semaphore, ein Zurücksetzungsereignis usw.

Um eine Auflistung für mehrere Threads zu verwenden, von denen einer der UI-Thread ist, der den ItemsControlbesitzt, müssen Sie die folgenden Schritte ausführen:

  1. Wählen Sie einen Synchronisierungsmechanismus aus.

  2. Synchronisieren Sie den gesamten Zugriff von der Anwendung mit der Sammlung mithilfe dieses Mechanismus.

  3. Rufen Sie die EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Überladung auf, um WPF darüber zu informieren, dass Sie einen anderen Mechanismus als einfache Sperren verwenden.

    • Der Aufruf muss im UI-Thread erfolgen.

    • Der Aufruf muss vor der Verwendung der Auflistung in einem anderen Thread oder vor dem Anfügen der -Auflistung erfolgen ItemsControl, je nachdem, was später ist.

  4. Stellen Sie sicher, dass eine Änderung an der Auflistung und die Benachrichtigung über diese Änderung (bis INotifyCollectionChanged) atomar sind. Der Zugriff von anderen Threads kann nicht eingreifen.  (Dies ist in der Regel kostenlos. Für instance ObservableCollection<T> garantiert dies, vorausgesetzt, dass alle Änderungen durch Synchronisierung geschützt sind.)

  5. Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.

  6. Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie (und DisableCollectionSynchronization, falls erforderlich) separat für jeden UI-Thread aufrufen EnableCollectionSynchronization .

  7. Vermeiden Sie einen Deadlock.  Dies liegt bereits in der Verantwortung der Anwendung, sobald sie sich für die Verwendung der Synchronisierung entscheidet, aber sie muss auch die Beteiligung von WPF an der Synchronisierung berücksichtigen. (Weitere Informationen finden Sie weiter unten.)

Im Gegenzug bietet WPF das folgende Verhalten:

  • Der CollectionView greift auf die Auflistung zu, indem die mit den folgenden Argumenten registrierte CollectionSynchronizationCallback aufgerufen wird:

    • collection: die Sammlung von Interesse.
    • context: das registrierte Kontextobjekt.
    • accessMethod: Ein Delegat, der den tatsächlichen Zugriff ausführt.
    • writeAccess: true , wenn der Delegat die Auflistung ändert, andernfalls false .

    Ihre CollectionSynchronizationCallback sollte die Synchronisierung für die Auflistung einrichten (unter Verwendung des context -Objekts und des writeAccess -Werts, je nach Bedarf), rufen Sie auf accessMethod, und lassen Sie die Synchronisierung los.

  • Verwaltet CollectionView eine "Schattenkopie" der Auflistung zur Verwendung im UI-Thread.

  • CollectionChanged Ereignisse werden beim Eintreffen (in einem beliebigen Thread) in die Warteschlange eingereiht.

  • Ausstehende Ereignisse werden asynchron auf die Schattenkopie im UI-Thread angewendet, wenn die Möglichkeit dazu vorhanden ist.

  • Der CollectionView verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Dies ist die Möglichkeit von WPF, einen Deadlock zu vermeiden (siehe vorheriger Artikel 7).  

Der Nettoeffekt besteht darin, dass Sie die Sammlung für jeden Thread ändern können, und diese Änderungen werden schließlich in der ItemsControl angezeigt, wenn der UI-Thread Zeit zum "Aufholen" hat.  Die Implementierung wurde optimiert, um die Rate zu drosseln, mit der Änderungen in den UI-Thread fließen, damit Hintergrundthreads den UI-Thread nicht überlasten und die Antwort auf normale Benutzereingaben verhungern.

Der context Parameter ist ein beliebiges Objekt, das an callbackübergeben wird. Sie können ihn verwenden, um den Synchronisierungsmechanismus zu bestimmen, der zum Steuern des Zugriffs auf collectionverwendet wird. Context kann sein null.

Gilt für: