Что может пойти не так? Я удалил BlockReentrancy() из OnCollectionChanged() ObservableCollection.C#

Место общения программистов C#
Anonymous
Что может пойти не так? Я удалил BlockReentrancy() из OnCollectionChanged() ObservableCollection.

Сообщение Anonymous »

Мой текущий проект вращается вокруг чтения, изменения и записи коллекции байтов. Я наблюдаю за изменениями в коллекции, используя ObservableCollection и подписываясь на его событие CollectionChanged.
Теперь, когда изменяются определенные байты, мне нужно чтобы отреагировать на это изменение, обновив некоторые другие байты в той же коллекции. Однако ObservableCollection не позволяет вносить изменения в коллекцию во время события CollectionChanged с помощью diposable, возвращаемого BlockReentrancy(), в его методе OnCollectionChanged() и вызов CheckReentrancy() в качестве защитного оператора в его модифицирующих методах (, Remove() и т. д.). См. код ниже, взятый из справочного источника Microsoft.

Код: Выделить всё

protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (CollectionChanged != null)
{
using (BlockReentrancy())
{
CollectionChanged(this, e);
}
}
}
В моем конкретном случае единственными изменениями являются действия NotifyCollectionChangedAction.Replace. Я никогда не буду добавлять, удалять или перемещать элементы. Обсуждая это с коллегой, мы пришли к выводу, что в данном конкретном случае повторные входы можно просто игнорировать. Затем я придумал эту настроенную UnsafeObservableCollection (формулировка может быть неоптимальной, пожалуйста, помилуйте).

Код: Выделить всё

public class UnsafeObservableCollection : ObservableCollection
{
public UnsafeObservableCollection() { }

public UnsafeObservableCollection(IEnumerable collection) : base(collection) { }

public UnsafeObservableCollection(List list) : base(list) { }

public override event NotifyCollectionChangedEventHandler? CollectionChanged;

// ignoring reentrancy, allowing for collection updates within a collection changed event
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) => CollectionChanged?.Invoke(this, e);
}
Я до сих пор не уверен, какие могут быть последствия, даже если я «просто» заменяю элементы. Могу ли я столкнуться с противоречивым состоянием, бесконечным циклом обновления или подобными проблемами?
Собираюсь ли я сделать что-то глупое, или это разумно, учитывая мой конкретный контекст?
Собираюсь ли я сделать что-то глупое, или это разумно, учитывая мой конкретный контекст?
Собираюсь ли я сделать что-то глупое, или это разумно, учитывая мой конкретный контекст?
em>
Я надеюсь, что кто-нибудь поможет мне лучше понять и/или скажет мне, не упускаю ли я сценарий, при котором это может сломаться. С уважением

Подробнее здесь: https://stackoverflow.com/questions/783 ... llectionts

Вернуться в «C#»