WPF: какой самый эффективный / быстрый способ добавления элементов в ListView? - PullRequest
17 голосов
/ 22 июля 2010

Мне нужно отображать множество строк в сетке, добавленной с довольно высокой частотой (в некоторых случаях до 10 строк в секунду), я выбрал ListView, потому что я предполагаю, что это самый быстрый элемент управления сеткой в ​​WPF.(конечно, намного быстрее, чем GridView)

Загрузка ЦП становится довольно высокой после добавления нескольких сотен тысяч элементов, и они продолжают поступать. Это довольно удивительно, поскольку ListView отображает только видимые строки, поэтому он не долженнезависимо от того, сколько всего добавлено.

Мой первый подход состоял в том, чтобы связать его с ObservableCollection, но через некоторое время загрузка ЦП возросла, и все окно стало нервным.

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

Чем я пытался создать подкласс ObservableCollection для вставок чанков, надеясь, что их пакетирование улучшит производительность / уменьшит нагрузку на процессор, но этот подход требует вызова CollectionView.Refresh, который аналогичен вызову Reset () о коллекции, а также неэффективно, когда в коллекции много предметов.

Очистка наблюдаемой коллекции и затем вызов myListView.Items.Refresh () для ее возврата к нулю возвращает процессор к начальной точке.

Начинаем исчерпывать идеи здесь .. Опять же, моя цель здесь - добавить / отобразить множество элементов и отобразить сетку из 8 столбцов наиболее эффективным способом. ListView кажется хорошим, просто нужнонекоторые способы, которыми я мог бы далее настроить это ..

ОБНОВЛЕНИЕ

после профилирования, ObservableCollection 800k строк в сетке, наиболее интенсивная работа процессора выполняется:

  • (75%) System.Windows.Media.MediaContext.RenderMessageHandler (объект resizedCompositionTarget)
  • (20%) ObservableCollection.OnCollectionChanged (NotifyCoolectionChanged ..)
хотя в зависимости от сеанса эти цифры сильно различаются ..

ОБНОВЛЕНИЕ 2 ... хорошо BindingList здесь явный победитель.

вот результаты (в тиках)бок о бок с 1 миллионом строк (и добавлением 10 элементов в секунду):

ObservableCollection: http://i.imgur.com/7ZoSv.png

BindingList http://i.imgur.com/jm5qF.png

, вы можете увидеть общее падениеАктивность процессора и около гаЕсли галочки требуются для обработки дерева в случае Binding List!Спасибо Акаш за эту прекрасную идею.

1 Ответ

19 голосов
/ 22 июля 2010

Вместо использования ObservableCollection я предложу класс BindingList, вы можете сделать что-то вроде этого ..

BindingList<string> list = new BindingList<string>();

list.AllowEdit = true;
list.AllowNew = true;
list.AllowRemove = true;

// set the list as items source
itemCollection.ItemsSource = list;

// add many items...

// disable UI updation
list.RaiseListChangedEvents = false;

for each(string s in MyCollection){
   list.Add(s);
}

// after all.. update the UI with following
list.RaiseListChangedEvents = true;
list.ResetBindings(); // this forces update of entire list

Вы можете включить / отключить обновление даже в пакетном режиме, вместо того, чтобы добавлять все одним выстрелом, BindingList имеетЯ работаю лучше, чем ObservableCollection во всех моих интерфейсах. Интересно, почему везде люди больше говорят о ObservableCollection, когда BindingList действительно превосходит ObservableCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...