Выполнение дорогостоящих операций в ObservableCollection.CollectionChanged - PullRequest
3 голосов
/ 18 января 2010

В моей модели мне нужно знать, когда конкретная коллекция изменяется, поэтому я подписываюсь на событие CollectionChanged в ObservableCollection.Это работает очень хорошо, за исключением того, что операция довольно дорогая.

Так что, когда код клиента делает:

foreach(Item i in longList)
{
    model.ObservableCollection.Add(i);
}

Я выполняю дорогостоящую операцию для каждой итерации, когда все, что важно, эторезультат после добавления последнего элемента.

Есть ли способ отменить текущий запущенный обработчик события, если другое событие CollectionChanged возникает, пока первое еще выполняется, а затем приступить к обработке самого последнего события?

Ответы [ 2 ]

3 голосов
/ 18 января 2010

ObservableCollection не является запечатанным классом. Получите свой собственный и добавьте метод BeginUpdate и EndUpdate () и свойство IsUpdating.

0 голосов
/ 18 января 2010

Не напрямую. Процесс, который вы запускаете, будет работать синхронно, поэтому следующее событие не произойдет, пока ваш текущий процесс не завершится.

Одна из альтернатив в подобных ситуациях - запустить таймер на CollectionChanged, а затем обработать тик таймера. Таким образом, если вы запускаете CollectionChanged несколько раз, таймер уже будет включен, и вы получите только одно событие "галочка".

...