Новая коллекция ObservableCollection против добавления элементов в цикл
С точки зрения скорости и количества генерируемых уведомлений, этот код:
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 ответ
Профилируй или проверь! Согласно документации, событие PropertyChanged происходит, когда элемент добавляется, удаляется, изменяется, перемещается или обновляется весь список. Поэтому вы можете написать тестовый код, который просто подписывается на это событие и посмотреть, что произойдет.
Быстродействующий и потокобезопасный наблюдаемый сбор - если это происходит из-за постоянного потока событий OnChanged, рассмотрите только запуск после массового обновления - кто-то уже сделал эту работу за вас
http://www.telerik.com/help/silverlight/radchart-performance-tips-and-tricks.html конкретно касается сценария, который вы описываете примерно на полпути вниз по странице. Их вывод такой же, как 2 - на самом деле код выглядит очень похоже:-)
Если замораживание происходит до того, как на самом деле имеет место привязка, то я должен убедиться, что задержка фактически не основана на рендеринге или из-за другой активности (например, времени, затраченного на загрузку коллекции). Опять же, профилирование это твой друг.