Привязка данных (WPF), вызывающая задержку пользовательского интерфейса - PullRequest
2 голосов
/ 03 марта 2011

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

Вот что я делаю сейчас: Я использую ObservableCollection, которая связана с сеткой данных.

Я использую фоновый поток, который зацикливается и вызывает Invoke для текущего диспетчера только при вставке / удалении из наблюдаемой коллекции. Вызов BeginInvoke вместо этого приводит к нежелательным результатам.

Я знаю, что такое обращение к диспетчеру вызывает задержку, но я не знаю, что еще делать. Раньше я использовал фоновых работников, но не думаю, что это применимо к моему сценарию.

Что я могу сделать, чтобы интерфейс реагировал?

Ответы [ 2 ]

8 голосов
/ 03 марта 2011

Пакетное обновление - фоновый поток может добавлять элементы в очередь, и вы можете периодически обновлять привязанную наблюдаемую коллекцию путем вызова.Взгляните на пространство имен System.Collections.Concurrent, если вам нужно работать с многопоточными производителями

6 голосов
/ 03 марта 2011

Основным недостатком вашего дизайна является то, что привязывая к ObservableCollection, вы заставляете пользовательский интерфейс отображать каждый элемент, который добавляется в список (возможно, тысячи) - даже если в конце обработки есть только 10 элементов, которыенеобходимо отобразить.

Я увидел огромные улучшения, изменив ObservableCollection на List и обновив DataGrid вручную в конце обработки - таким образом, пользовательский интерфейс должен обрабатывать только 10 элементов.Я обнаружил, что это изменение привело к увеличению производительности на 50%, а также к тому, что пользовательский интерфейс стал реагировать на 100% во время обработки списка.

Если вы обрабатываете список в течение длительного времени и вам необходимопоказать живые изменения, вы можете обновить DataGrid каждые 100 элементов.Это будет показывать результаты с точностью около 0,5 секунды, которая должна быть достаточно близкой.

...