GUI зависает при загрузке данных в BackgroundWorker - PullRequest
1 голос
/ 09 февраля 2011

У меня есть ListView элемент управления, получающий данные от BackgroundWorker до ReportProgress. Рабочий сбрасывает около ста рядов в быстрой последовательности. Каждый кусок данных запускает событие ProgressChanged, и поток GUI добавляет новый элемент в ListView.

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

Есть идеи?

Кроме того, тесты выполняются на очень быстрой машине, поэтому я не думаю, что производительность компьютера является проблемой.

Это приложение WinForms.

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Поместите это в рабочий цикл BGW после вызова ReportProgress:

 System.Threading.Thread.Sleep(15);

Вероятность того, что вы теперь увидите обновление ListView, хорошая.Здесь происходит то, что поток пользовательского интерфейса заполняется запросами на делегирование.Которые всегда отправляются до уведомления краски.Если запрос на next поступает до того, как предыдущий завершил работу, он никогда не сможет выполнить обычные служебные задачи.Люблю рисовать и реагировать на ввод.Элементы действительно добавляются в представление списка, вы просто не видите, как это делается.

Реже вызывайте ReportProgress.Делать это более 25 раз в секунду - пустая трата ресурсов, и никто не может увидеть разницу.Позвольте BGW сохранить элементы в List <> и сократить накладные расходы потока пользовательского интерфейса, вызвав AddRange ().

1 голос
/ 09 февраля 2011

Вы можете попробовать загрузить элементы в ListView1.Items, используя AddRange вместо AddПросто заполните промежуточный массив и используйте с AddRange.

0 голосов
/ 09 февраля 2011

Добавление строки один за другим в ListView приведет к зависанию даже на быстрых машинах.

Попробуйте вызвать ListView.SuspendLayout() и ListView.ResumeLayout() до и после процесса заполнения.

...