UI Интенсивное применение - PullRequest
0 голосов
/ 08 марта 2012

В моей программе есть редактор карт, после загрузки информации из базы данных мне нужно сгенерировать несколько пользовательских элементов управления (6000-10000 в зависимости от карты). К сожалению, он блокирует экран пользователя на 10-20 секунд.

Как я могу использовать ленивую загрузку? Как мне обойтись без сбоев и блокировки экрана?

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Этот вопрос очень широкий. Но я могу дать вам несколько советов. Во-первых, я уверен, что вам не нужно так много пользовательских элементов управления. Подумайте о том, сколько устройств ввода у пользователя, он не может взаимодействовать с таким количеством элементов управления одновременно . Таким образом, вы можете «обмануть» эти элементы управления несколькими различными способами. Например, отобразите изображение элемента управления и переключите его, если пользователь начинает с ним взаимодействовать. Другое дело, что вам не нужно то, чего вы не видите. Зачем создавать список из 10000 элементов, если на экране поместится только 10 элементов? Нет никаких причин, поэтому есть способы смягчить это, один из них называется Виртуализация , что можно сделать несколькими способами. Вы можете использовать виртуализацию пользовательского интерфейса, отложив загрузку компонентов пользовательского интерфейса или виртуализацию данных. Другое дело, в сотрудничестве с виртуализацией данных является использование потоков или фонового работника для обработки загрузки такого большого количества данных. Создайте свои данные в пакетном режиме, чтобы дать потоку пользовательского интерфейса время для обработки сообщений Windows.

1 голос
/ 08 марта 2012

Изучите Binding или выполняете работу в фоновом потоке? Если они находятся в ListView, посмотрите на VirtualMode: http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

Во что вы загружаете эти элементы управления? Вы делаете это в потоке пользовательского интерфейса?

0 голосов
/ 08 марта 2012

Используйте TPL (Task Parallel Library) для выполнения задач БД в отдельном потоке ... это выглядит так:

Task.Factory.StartNew(() => MyLongRunningMethod));

Проверьте эту отличную статью о CodeProject для получения дополнительной информации ...

РЕДАКТИРОВАТЬ: как отмечалось ниже, исходный ответ подразумевал, что каким-то образом элементы управления могут быть сгенерированы в отдельном потоке, но в действительности как часть визуального дерева и, следовательно, элементы управления, пользовательский интерфейс должен быть создан в потоке интерфейса, чтобы он действительное предложение ...

РЕДАКТИРОВАТЬ: Не видите, как можно было бы разместить 10000 пользовательских элементов управления на экране Signle, поэтому должен быть способ использовать некоторый тип схемы виртуализации, где будут генерироваться только видимые элементы управления, а остальные элементы управления будут генерируется по требованию ...

...