BindingOperations.EnableCollectionSynchronization Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ermöglicht es einem CollectionView Objekt, an synchronisiertem Zugriff auf eine Auflistung teilzunehmen, die für mehrere Threads verwendet wird.
Überlädt
| Name | Beschreibung |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
Ermöglicht es einem CollectionView Objekt, an synchronisiertem Zugriff auf eine Auflistung teilzunehmen, die in mehreren Threads mithilfe eines einfachen Sperrmechanismus verwendet wird. |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
Ermöglicht es einem CollectionView Objekt, an synchronisiertem Zugriff auf eine Auflistung teilzunehmen, die in mehreren Threads verwendet wird, indem ein anderer Mechanismus als eine einfache Sperre verwendet wird. |
Hinweise
Eine WPF-Anwendung kann eine Sammlung von Daten mithilfe eines ItemsControl oder einer seiner Unterklassen (ListBox, DataGrid, TreeView, ListView usw.) anzeigen. WPF kanälen den gesamten Zugriff auf die Sammlung über eine Unterklasse von CollectionView. Sowohl der ItemsControl Thread als auch die CollectionView haben Affinität zum Thread, auf dem die ItemsControl erstellt wurde, was bedeutet, dass die Verwendung auf einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt auch für die Sammlung.
Möglicherweise möchten Sie die Sammlung für mehrere Threads verwenden. Beispielsweise möchten Sie die Sammlung (Hinzufügen oder Entfernen von Elementen) in einem "Datensammlungsthread" aktualisieren, während die Ergebnisse in einem Thread "Benutzeroberfläche" angezeigt werden, sodass die Benutzeroberfläche reaktionsfähig bleibt, während das Sammeln von Daten stattfindet. In einer solchen Situation sind Sie dafür verantwortlich, den synchronisierten ("threadsicheren") Zugriff auf die Sammlung sicherzustellen. Dies erfolgt in der Regel entweder mit einem einfachen Sperrmechanismus oder einem aufwändigeren Synchronisierungsmechanismus wie Semaphoren, Zurücksetzen von Ereignissen 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 teilnimmt. Dazu rufen Sie die EnableCollectionSynchronization Methode auf.
Um eine Sammlung für mehrere Threads zu verwenden, einer davon ist der UI-Thread, der ItemsControldem Benutzeroberflächenthread gehört, hat eine Anwendung die folgenden Verantwortlichkeiten:
Wählen Sie einen Synchronisierungsmechanismus aus.
Synchronisieren Sie mit diesem Mechanismus den gesamten Zugriff von der Anwendung mit der Sammlung.
Rufen Sie EnableCollectionSynchronization auf, um WPF über den Mechanismus zu informieren.
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 an die ItemsControlAuflistung erfolgen, je nachdem, welcher Zeitpunkt später erfolgt.
Rufen Sie die EnableCollectionSynchronization(IEnumerable, Object) Überladung auf, wenn Sie einen einfachen Sperrmechanismus verwenden. Rufen Sie die EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Überladung auf, wenn Sie einen aufwendigeren Mechanismus verwenden.
Stellen Sie sicher, dass eine Änderung an der Sammlung und die Benachrichtigung über diese Änderung (durch INotifyCollectionChanged) atomar sind; kein Zugriff von anderen Threads kann eingreifen. (Dies ist in der Regel kostenlos. Garantiert dies beispielsweise ObservableCollection<T> , sofern alle Änderungen durch die Synchronisierung geschützt sind.)
Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.
Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie für jeden UI-Thread separat (und EnableCollectionSynchronizationgegebenenfalls) aufrufen DisableCollectionSynchronization .
Vermeiden Sie deadlock. Dies ist bereits die Verantwortung der Anwendung, sobald sie die Synchronisierung verwendet, aber sie muss auch die Teilnahme WPF an der Synchronisierung berücksichtigen, wie im folgenden Absatz beschrieben.
Im Gegenzug bietet WPF das folgende Verhalten:
Die CollectionView Sammlung greift mithilfe des angegebenen Synchronisierungsmechanismus auf die Sammlung zu.
Die CollectionView Verwaltet eine "Schattenkopie" der Sammlung für die 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 dies die Möglichkeit hat.
Dies CollectionView verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Dies ist WPF Möglichkeit, eine Sperre zu vermeiden (siehe vorheriges Element 7).
Der Nettoeffekt besteht darin, dass Sie die Sammlung in einem beliebigen Thread ändern können, und diese Änderungen werden schließlich in dem ItemsControl Fall angezeigt, wenn der UI-Thread Zeit hat, "aufholen" zu können. Die Implementierung wurde optimiert, um die Geschwindigkeit zu drosseln, die sich in den UI-Thread ändert, um hintergrundthreads davon abzuhalten, den UI-Thread zu überlasten und die Antwort auf normale Benutzereingaben zu verhungern.
EnableCollectionSynchronization(IEnumerable, Object)
Ermöglicht es einem CollectionView Objekt, an synchronisiertem Zugriff auf eine Auflistung teilzunehmen, die in mehreren Threads mithilfe eines einfachen Sperrmechanismus 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 Sammlung, die synchronisierten Zugriff benötigt.
- lockObject
- Object
Das Objekt, das beim Zugriff auf die Auflistung gesperrt werden soll.
Hinweise
Eine WPF-Anwendung kann eine Sammlung von Daten mithilfe eines ItemsControl oder einer seiner Unterklassen (ListBox, DataGrid, TreeView, ListView usw.) anzeigen. WPF kanälen den gesamten Zugriff auf die Sammlung über eine Unterklasse von CollectionView. Sowohl der ItemsControl Thread als auch die CollectionView haben Affinität zum Thread, auf dem die ItemsControl erstellt wurde, was bedeutet, dass die Verwendung auf einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt auch für die Sammlung.
Möglicherweise möchten Sie die Sammlung für mehrere Threads verwenden. Beispielsweise möchten Sie die Sammlung (Hinzufügen oder Entfernen von Elementen) in einem "Datensammlungsthread" aktualisieren, während die Ergebnisse in einem Thread "Benutzeroberfläche" angezeigt werden, sodass die Benutzeroberfläche reaktionsfähig bleibt, während das Sammeln von Daten stattfindet. 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 beteiligt ist. Durch Aufrufen der EnableCollectionSynchronization(IEnumerable, Object) Methode können Sie dies mithilfe eines einfachen Sperrmechanismus tun.
Um eine Auflistung für mehrere Threads zu verwenden, einer davon ist der UI-Thread, der ItemsControlder Besitzer ist, müssen Sie die folgenden Schritte ausführen:
Instanziieren Sie ein Objekt, das beim Zugriff auf die Auflistung gesperrt werden soll.
Synchronisieren Sie den gesamten Zugriff von der Anwendung mit der Auflistung, indem Sie dieses Objekt sperren.
Rufen Sie EnableCollectionSynchronization(IEnumerable, Object) auf, 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 an die ItemsControlAuflistung erfolgen, je nachdem, welcher Zeitpunkt später erfolgt.
Stellen Sie sicher, dass eine Änderung an der Sammlung und die Benachrichtigung über diese Änderung (durch INotifyCollectionChanged) atomar sind; kein Zugriff von anderen Threads kann eingreifen. (Dies ist in der Regel kostenlos. Garantiert dies beispielsweise ObservableCollection<T> , sofern alle Änderungen durch die Synchronisierung geschützt sind.)
Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.
Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie für jeden UI-Thread separat (und EnableCollectionSynchronizationgegebenenfalls) aufrufen DisableCollectionSynchronization .
Vermeiden Sie deadlock. Dies ist bereits die Verantwortung der Anwendung, sobald sie sich für die Verwendung der Synchronisierung entscheidet, aber sie muss auch die Teilnahme WPF an der Synchronisierung berücksichtigen. (Weitere Informationen finden Sie weiter unten.)
Im Gegenzug bietet WPF das folgende Verhalten:
Die CollectionView Sammlung greift mithilfe des Sperrmechanismus auf die Auflistung zu.
Die CollectionView Verwaltet eine "Schattenkopie" der Sammlung für die 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 dies die Möglichkeit hat.
Die CollectionView Anwendung verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Dies ist WPF Möglichkeit, eine Sperre zu vermeiden (siehe vorheriges Element 7).
Der Nettoeffekt besteht darin, dass Sie die Sammlung in einem beliebigen Thread ändern können, und diese Änderungen werden schließlich in dem ItemsControl Fall angezeigt, wenn der UI-Thread Zeit hat, "aufholen" zu können. Die Implementierung wurde optimiert, um die Geschwindigkeit zu drosseln, die sich in den UI-Thread ändert, um hintergrundthreads davon abzuhalten, den UI-Thread zu überlasten und die Antwort auf normale Benutzereingaben zu verhungern.
Gilt für:
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
Ermöglicht es einem CollectionView Objekt, an synchronisiertem Zugriff auf eine Auflistung teilzunehmen, die in mehreren Threads verwendet wird, indem ein anderer Mechanismus als eine einfache Sperre 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 Sammlung, 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 es verwenden, um sicherzustellen, dass auf die Sammlung jeweils über einen Thread zugegriffen wird.
Hinweise
Eine WPF-Anwendung kann eine Sammlung von Daten mithilfe eines ItemsControl oder einer seiner Unterklassen (ListBox, DataGrid, TreeView, ListView usw.) anzeigen. WPF kanälen den gesamten Zugriff auf die Sammlung über eine Unterklasse von CollectionView. Sowohl der ItemsControl Thread als auch die CollectionView haben Affinität zum Thread, auf dem die ItemsControl erstellt wurde, was bedeutet, dass die Verwendung auf einem anderen Thread verboten ist und eine Ausnahme auslöst. Diese Einschränkung gilt auch für die Sammlung.
Möglicherweise möchten Sie die Sammlung für mehrere Threads verwenden. Beispielsweise möchten Sie die Sammlung (Hinzufügen oder Entfernen von Elementen) in einem "Datensammlungsthread" aktualisieren, während die Ergebnisse in einem Thread "Benutzeroberfläche" angezeigt werden, sodass die Benutzeroberfläche reaktionsfähig bleibt, während das Sammeln von Daten stattfindet. 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 beteiligt ist. Durch Aufrufen der EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Methode können Sie dazu einen Synchronisierungsmechanismus wie z. B. Semaphoren, ein Reset-Ereignis usw. verwenden.
Um eine Auflistung für mehrere Threads zu verwenden, einer davon ist der UI-Thread, der ItemsControlder Besitzer ist, müssen Sie die folgenden Schritte ausführen:
Wählen Sie einen Synchronisierungsmechanismus aus.
Synchronisieren Sie mit diesem Mechanismus den gesamten Zugriff von der Anwendung mit der Sammlung.
Rufen Sie die überladene EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) auf, um WPF darüber zu informieren, dass Sie einen anderen Mechanismus als einfaches 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 an die ItemsControlAuflistung erfolgen, je nachdem, welcher Zeitpunkt später erfolgt.
Stellen Sie sicher, dass eine Änderung an der Sammlung und die Benachrichtigung über diese Änderung (durch INotifyCollectionChanged) atomar sind; kein Zugriff von anderen Threads kann eingreifen. (Dies ist in der Regel kostenlos. Garantiert dies beispielsweise ObservableCollection<T> , sofern alle Änderungen durch die Synchronisierung geschützt sind.)
Wenn Sie aufrufen DisableCollectionSynchronization, muss dieser Aufruf auch im UI-Thread erfolgen.
Wenn Sie dieselbe Sammlung für mehrere UI-Threads verwenden möchten, müssen Sie für jeden UI-Thread separat (und EnableCollectionSynchronizationgegebenenfalls) aufrufen DisableCollectionSynchronization .
Vermeiden Sie deadlock. Dies ist bereits die Verantwortung der Anwendung, sobald sie sich für die Verwendung der Synchronisierung entscheidet, aber sie muss auch die Teilnahme WPF an der Synchronisierung berücksichtigen. (Weitere Informationen finden Sie weiter unten.)
Im Gegenzug bietet WPF das folgende Verhalten:
Die CollectionView Auflistung wird durch Aufrufen der registrierten CollectionSynchronizationCallback Argumente auf die Auflistung zugegriffen:
-
collection: die Sammlung von Interesse. -
context: das registrierte Kontextobjekt. -
accessMethod: eine Stellvertretung, die den tatsächlichen Zugriff ausführt. -
writeAccess:truewenn die Stellvertretung die Sammlung ändert;falseandernfalls.
Sie CollectionSynchronizationCallback sollten die Synchronisierung für die Auflistung (unter Verwendung des
contextObjekts und deswriteAccessWerts, je nach Bedarf) einrichten, dieaccessMethodSynchronisierung aufrufen und dann die Synchronisierung freigeben.-
Die CollectionView Verwaltet eine "Schattenkopie" der Sammlung für die 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 dies die Möglichkeit hat.
Die CollectionView Anwendung verwendet keinen anderen Synchronisierungsmechanismus, der für die Anwendung sichtbar ist. Dies ist WPF Möglichkeit, eine Sperre zu vermeiden (siehe vorheriges Element 7).
Der Nettoeffekt besteht darin, dass Sie die Sammlung in einem beliebigen Thread ändern können, und diese Änderungen werden schließlich in dem ItemsControl Fall angezeigt, wenn der UI-Thread Zeit hat, "aufholen" zu können. Die Implementierung wurde optimiert, um die Geschwindigkeit zu drosseln, die sich in den UI-Thread ändert, um hintergrundthreads davon abzuhalten, den UI-Thread zu überlasten und die Antwort auf normale Benutzereingaben zu verhungern.
Der context Parameter ist ein beliebiges Objekt, das an die callback. Sie können ihn verwenden, um den Synchronisierungsmechanismus zu bestimmen, mit dem der Zugriff collectiongesteuert wird.
Context kann sein null.