Быстро обновляемый DataGridView

#c# #performance #datagridview #insert-update

#c# #Производительность #datagridview #вставить-обновить

Вопрос:

Я использую DataGridView для отслеживания событий ввода-вывода. Каждый раз, когда происходит новое событие ввода-вывода, DataGridView заполняется новым элементом, содержащим временную метку среди других данных. Эти обновления приходят каждые 10 мс, и я хочу разместить новые элементы в верхней части сетки.

Мне нужно всего лишь сохранить ~ 100 строк в сетке; более старые следует отбросить, чтобы не использовать память. Все мои попытки оказались слишком медленными, есть ли у вас какие-либо идеи о том, как подойти к этому?

Ответ №1:

Отображение тикающих данных — довольно сложная задача. Одним из важнейших шагов по повышению производительности может быть снижение частоты обновления до числа, распознаваемого человеческим глазом — 20 обновлений в секунду без реакции на каждое событие ввода-вывода.

  1. Создайте или используйте кольцевой буфер для хранения только 100 записей и уменьшения объема GC / памяти.
  2. Используйте таймер диспетчера и планируйте обновление сетки каждые 50 мс. По истечении таймера извлеките данные из буфера в предварительно выделенную коллекцию и полностью обновите сетку.

Затем вы можете еще больше улучшить реализацию, оптимизировав шаг 2 — скажем, уменьшив количество ячеек.

Комментарии:

1. Итак, я создал кольцевой буфер, который реализует IList<T>, ICollection<T>, IEnumerable<T> и IEnumerable . Однако, когда я привязываю это к DataGridView (через BindingSource), DataGridView отображает свойства кольцевого буфера вместо его элементов. Есть идеи?

2. Я бы просто скопировал состояние RingBuffer в новую коллекцию. «возьмите данные буфера в предварительно выделенную коллекцию и полностью обновите сетку». Привязка к коллекции, которая постоянно меняется в фоновом режиме, не является хорошей идеей.