Это реализация BlockReentrancy()
protected IDisposable BlockReentrancy()
{
this._monitor.Enter();
return this._monitor;
}
Есть еще один метод CheckReentrancy()
protected void CheckReentrancy()
{
if ((this._monitor.Busy && (this.CollectionChanged != null)) && (this.CollectionChanged.GetInvocationList().Length > 1))
{
throw new InvalidOperationException(SR.GetString("ObservableCollectionReentrancyNotAllowed"));
}
}
Такие методы как ClearItems
, InsertItem
, MoveItem
, RemoveItem
, SetItem
проверяют CheckReentrancy()
перед изменением коллекции.
Таким образом, приведенный ниже код гарантирует, что коллекция не будет изменена внутри using
, но только в том случае, если на событие CollectionChanged
подписано более одного обработчика.
using BlockReentrancy())
{
CollectionChanged(this, e);
}
Этот пример демонстрирует эффект BlockReentrancy()
private static void Main()
{
collection.CollectionChanged += CollectionCollectionChanged1;
collection.CollectionChanged += CollectionCollectionChanged2;
collection.Add(1);
}
private static void CollectionCollectionChanged1(object sender, NotifyCollectionChangedEventArgs e)
{
collection.Add(2); // this line will throw exception
}
private static void CollectionCollectionChanged2(object sender, NotifyCollectionChangedEventArgs e)
{
}