none
WPF оптимизация отображения данных RRS feed

  • Вопрос

  • Есть DataTable  Для ее отображения приходится либо в каждом апдейте  формировать и биндить датавью. Я пробовал и так, и так - нагрузка на процессор примерно одинаковая, и при этом достаточно существенная. Есть ли способы сделать отрисовку быстрее, а код оптимальнее?

    • Изменено Qwester33 8 октября 2010 г. 17:45
    5 октября 2010 г. 14:21

Ответы

Все ответы

  • Задача: на входе dataTable, на выходе ObservableCollection

    Можно ли сделать оптимальнее и быстрее?  Нужна очень быстрая отрисовка.

     

     

    • Изменено Qwester33 8 октября 2010 г. 17:46
    6 октября 2010 г. 15:43
  • http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/ или гугл по "observablecollection add multiple items"
     
    • Помечено в качестве ответа Qwester33 6 октября 2010 г. 18:32
    6 октября 2010 г. 17:56
    Модератор
  • Супер, идеальное решение.
    6 октября 2010 г. 18:45
  • А что будет быстрее работать для очистки коллекции, observablecollection.Clear() или реализованнй по схеме по ссылке метод .RemoveRange (для удаления последовательно каждого элемента). Всего элементов - 30.
    6 октября 2010 г. 19:06
  • RemoveRange - это удаление определенных элементов, а не сразу всех, насколько я понял. Это не совсем Clear() :)

    Вообще сам подход какой-то неправильный :) Если данные в большинстве ячеек не меняются при каждом обновлении, то выгоднее было бы мержить их в существующую коллекцию, по ячейкам. А не передергивать весь грид.

    6 октября 2010 г. 19:37
    Модератор
  • Меняются сразу много ячеек, обычно процентов 30. Мысль я понял, но в текущей реализации, когда мне приходит сразу новая DataTable (а не ее изменения), мне показалось бессмысленным сравнивать старую с новой и менять только изменившиеся ячейки. Или это будет быстрее, как считаете, при таком количестве одновременно меняющихся ячеек? А вообще проблема с нагрузкой проца существует, да.

    В прошлом вопросе я и хотел уточнить, как работает .Clear(), то есть "подавляет" ли он OnCollectionChanged, или во время выполнения.Clear(), у меня также будет идти дополнительная нагрузка в виде визуализации удаления? То есть стоит-ли делать удаление всех элементов по аналогии с .AddRange?

    6 октября 2010 г. 19:52
  • Clear работает так же, как и AddRange - вызывает одно общее событие об изменении коллекции, а не по одному событию на каждый айтем.
    6 октября 2010 г. 20:51
    Модератор
  • Сделал observablecollection, как по ссылке, но не сказал бы, что что-то изменилось в плане нагрузки. Нагрузка проца от этого потока примерно такая-же (15-25% на ядро). А вот визуально стало стало немного заметно наличие волн при изменениях
    7 октября 2010 г. 6:57