BlockReentrancy in ObservableCollection<T>
Könnte bitte jemand so freundlich, mir zu erklären, was der Zweck der BlockReentrancy
Methode ist in der ObservableCollection<T>
?
MSDN zeigt Folgendes Beispiel:
//The typical usage is to wrap an OnCollectionChanged call within a using scope, as in the following example:
using (BlockReentrancy())
{
//OnCollectionChanged call
}
Aber das scheint nicht zu klären für mich, was der Zweck ist. Jemand darauf zu erklären?
- Aussprechen
BlockReëntrancy
- Zusätzlich zu den akzeptierten Antworten, ist es erwähnenswert, dass
using (BlockReentrancy()) {}
ist auch erforderlich im multi-threaded Fall verwenden, wenn die Sammlung aktualisiert, so Häufig, dass es zu überschneidungen mit derOnCollectionChanged
Verarbeitung. Dies kann möglicherweise passieren, mit nur einem einzelnen XAML-unverbindlich und ohne weitere explizite Abonnenten in der benutzerdefinierten code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer
ObservableCollection
implementiertINotifyCollectionChanged
und so hat es eineCollectionChanged
Veranstaltung. Wenn es ein Teilnehmer an dieser Veranstaltung, konnten Sie weiter ändern die Kollektion, die Sammlung ist bereits in den Prozess der Benachrichtigung. Da dieCollectionChanged
Veranstaltung verfolgt genau, was sich geändert hat, diese Interaktion kann sehr chaotisch.Als Ergebnis der
ObservableCollection
ermöglicht, als ein spezieller Fall eines einzigen Abonnenten derCollectionChanged
Veranstaltung zu ändern, die Sammlung von seinem handler. Aber es verbietet änderung der Auflistung vonCollectionChanged
handler wenn es zwei oder mehr Abonnenten derCollectionChanged
Veranstaltung.Den beiden Methoden
BlockReentrancy
undCheckReentancy
werden verwendet, um die Umsetzung dieser Logik. DieBlockReentrancy
ist am Anfang derOnCollectionChanged
Methode undCheckReentancy
wird in allen Methoden, die zur Veränderung der Sammlung.Dies ist die Realisierung der
BlockReentrancy()
Gibt es eine andere Methode
CheckReentrancy()
Methoden wie
ClearItems
,InsertItem
,MoveItem
,RemoveItem
,SetItem
überprüfenCheckReentrancy()
vor dem ändern Sammlung.Also den code unten garantiert, dass die collection nicht geändert werden, innerhalb von
using
, aber nur, wenn es mehr als ein handler abonniertCollectionChanged
Veranstaltung.Dieses Beispiel veranschaulicht die Wirkung von
BlockReentrancy()
StackOverflowException
keineInvalidOperationException
. In diesem Fall Reentranz wird nicht überprüft. Siehe meine Antwort.Reentranz ist, wenn eine Methode etwas tut, direkt oder indirekt, die bewirkt, dass die Methode erneut aufgerufen werden, möglicherweise rekursiv. In diesem Fall wird die using-block verwendet werden soll innerhalb der OnCollectionChanged delegieren, wenn Sie verhindern möchten, dass der Wechsel von der Sammlung innerhalb des handlers; versuche, es zu ändern, wird eine Ausnahme ausgelöst. Wenn Sie es nicht verwenden, dann alle versuche, ändern Sie die Sammlung führen würde OnCollectionChanged werden erneut aufgerufen.
Unten ist die code hinter BlockReentrancy. CheckReentrancy heißt am Anfang jeder Kollektion modifier-Methode in der Implementierung von ObservableCollection.
(Copyright (c) .NET Foundation und Mitwirkende)