Как добавить тысячи элементов в связанную коллекцию без блокировки графического интерфейса

У меня есть установка, в которой потенциально тысячи элементов (думают, что 3000 -5000 )будут добавлены к ObservableCollection, привязанному к некоторому визуальному интерфейсу. В настоящее время процесс их добавления идет довольно медленно (ок. 4 секунды/1000 элементов ), и, конечно же, графический интерфейс не отвечает в течение этого времени. Каков хороший способ справиться с одновременным перемещением такого количества элементов в коллекцию, не беспокоясь о блокировке системы? Я просмотрел DispatcherTimer, но не уверен, что он предоставит все, что мне нужно.

Другой вопрос -Можно ли как-то ускорить создание этих объектов, чтобы их добавление в коллекцию не занимало так много времени? В настоящее время я использую их вот так:Collection.Add(new Item())Может ли генерация элементов заранее, в фоновом потоке, уменьшить время, необходимое для их добавления, на заметную величину?

Изменить :Виртуализация невозможна. В требованиях указан внешний вид WrapPanel, поэтому на самом деле дисплей представляет собой ListBoxс шаблонной панелью ItemsPanel

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

Edit3 :Итак, ответ находится в одном месте -Я решил эту проблему (с помощью снизу ), создав класс, который наследуется от ObservableCollection. Этот класс сделал две вещи: -представил метод для одновременного добавления коллекций и добавил возможность подавлять CollectionChangedсобытие. С этими изменениями время, необходимое для добавления 3000 элементов, составляет примерно 0,4 секунды (97% улучшение ).Эта ссылка описывает реализацию этих изменений.

18
задан steveg89 14 August 2012 в 19:49
поделиться