новая коллекция ObservableCollection против добавления элементов в цикл - PullRequest
4 голосов
/ 01 февраля 2012

С точки зрения скорости и количества генерируемых уведомлений , это код:

ObservableCollection<Foo> foo = new ObservableCollection<Foo>(bar);
this.SomeProperty = foo;

так же, как:

this.SomeProperty = new ObservableCollection<Foo>();

foreach (var v in bar) 
{
    this.SomeProperty.Add(v);
}

Если они одинаковые, возможно ли как-то отключить сгенерированные уведомления?

Цель: Я пытаюсь ускорить отображение Telerik RadChart в серебряном свете. Кажется, что для отображения (и замораживания приложения в браузере) требуется некоторое время даже после установки свойства, содержащего ObservableCollection. Как только график составлен, все работает правильно.

1 Ответ

7 голосов
/ 01 февраля 2012
  1. Профилируй или проверь! Согласно документам, PropertyChanged событие происходит, когда элемент добавляется, удаляется, изменен, перемещен или обновлен весь список. Вы можете поэтому написать тестовый код, который просто подписывается на это событие и посмотреть, что случается.

  2. Быстродействующий и потокобезопасный наблюдаемый набор - если это происходит из-за постоянного потока событий OnChanged, рассмотрите только запуск после массового обновления - кто-то уже сделал эту работу за вас

  3. http://www.telerik.com/help/silverlight/radchart-performance-tips-and-tricks.html конкретно касается сценария, который вы описываете, примерно на полпути вниз по странице. Их вывод такой же, как 2 - на самом деле код выглядит очень похоже: -)

Если замораживание происходит до того, как на самом деле имеет место привязка, то я бы удостоверился, что задержка фактически не основана на рендеринге или из-за другой активности (например, времени, затраченного на загрузку коллекции). Опять же, профилирование - твой друг.

...