PerformenceProgessBar и ObservableCollection - PullRequest
0 голосов
/ 13 марта 2011

У меня есть ObservableCollection, которая получает данные из foreach. Пользовательский интерфейс прекрасно обновляется, когда в коллекцию вносятся изменения, но есть задержка, так как размер коллекции начинает увеличиваться в размере. У меня в коллекции около 500+ предметов, которые удаляются, переупорядочиваются и добавляются. Но я заметил, что существует определенная задержка между моментом внесения изменений и их отражением в пользовательском интерфейсе. Пример ниже является простым. Очевидно, что индикатор выполнения в этом случае не будет работать долго (доли секунды), но я хочу подчеркнуть, что пользовательский интерфейс не будет отражать изменения, которые я внес в течение многих, многих заметных секунд после индикатор выполнения останавливается ниже. Какое событие я могу зафиксировать или реализовать в своем объекте, который позволит мне добавить код, который обновляет индикатор выполнения, пока ObservableCollection передается в пользовательский интерфейс? Или кто-то хочет отправить мне фотографию собаки "DealWithIt":)

a_progressbar.IsIndeterminate = true;
foreach (Group<SomeItem> sortedItem in sortedItems)
{
    OList.Add(sortedItem);
}
a_progressbar.IsIndeterminate = false;

Обновление Вот код, который я использовал, чтобы заставить его работать.

            _dataBinder = new BackgroundWorker();
            _dataBinder.DoWork += new DoWorkEventHandler(DataBinderWork);
            _dataBinder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DataBinderComplete);

...

        private void DataBinderComplete(object sender, RunWorkerCompletedEventArgs e)
        {
            Dispatcher.BeginInvoke(() =>
            {
                a_progressbar.IsIndeterminate = false;
            });
        }

        private void DataBinderWork(object sender, DoWorkEventArgs e)
        {
            Dispatcher.BeginInvoke(() => LotsOfWork());
        }

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Звучит как хорошая работа для компонента BackgroundWorker .Компонент позволит вам выполнять дорогостоящие операции в фоновом потоке, чтобы ваш пользовательский интерфейс не зависал;тем временем поток пользовательского интерфейса может быть уведомлен через события, чтобы он знал, когда работа была завершена.

Обновление :

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

У меня были проблемы с ObservableCollection в прошлом, потому что это вызывает событие каждый раз, когда добавляется элемент, что делаетотзывчивость интерфейса плохая.Мой обходной путь состоял в том, чтобы создать подкласс коллекции, где вы могли бы сделать AddRange, который вызвал бы только одно событие, но просто создать новую коллекцию, которая не привязана к пользовательскому интерфейсу, а затем связать ее после ее заполнения - это еще один вариант..

0 голосов
/ 15 марта 2011

Большое предупреждение против использования ProgressBar.IsIndeterminate - он занимает более 60% ресурсов ЦП и может иметь катастрофические последствия в некоторых случаях. См. эту статью для получения дополнительной информации.

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