2009-03-26 2 views
6

У меня есть ряд форм и перемещаться между ними.Как ускорить рендеринг .NET winforms

В каждой форме есть набор элементов управления, для которых я загружаю свойства из базы данных SQLite, и это длительная (около 1 с) операция, которая не дает пользователям лучшего ощущения, потому что форма постепенно рисуется.

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

Есть ли хорошее решение, помимо ускорения всего приложения, путем кэширования загруженных данных?

ответ

0

Назад в VB days Я использовал API LockWindowUpdate. Поскольку это принимает дескриптор окна, его также следует использовать с WinForms. Хотя, никогда не пробовал.

4

Существует простой способ ускорить воспринимаемую производительность многих элементов управления, особенно данных интенсивные из них, как ListViews, ListBoxes, комбо-боксы и т.д.

Перед тем, как заполнить их вызвать метод BeginUpdate(), и когда сделано называть EndUpdate(). Это отключает перерисовку элемента управления до тех пор, пока вы не заполните его данными.

1

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

2

Извините. Для этого нужна резьба. «Проблемы с перекрестной резьбой» четко определены и существуют общие шаблоны для работы с ними. Просто уменьшите места, где потоки взаимодействуют с минимумом (в этом случае это будет одно место - после загрузки данных), и оно становится тривиальным.

Есть также несколько классов, которые упрощают многопоточность в приложении winforms, поскольку они абстрагируют взаимодействие между потоками. BackgroundWorker (ссылка на сообщение в блоге об этом) выполнит работу над другим потоком для вас и сообщит вам, когда это будет сделано, включив событие в потоке пользовательского интерфейса. Вы получаете преимущества многопоточности без каких-либо подводных камней.

0

У этой ссылки есть какое-то приятное решение, насколько я думаю, что процесс BackgroundWorker должен помочь. http://devcomponents.com/blog/?p=361

Смежные вопросы