Как ускорить рендеринг .NET winforms - PullRequest
7 голосов
/ 26 марта 2009

У меня есть ряд форм и перемещаться между ними.

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

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

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

Ответы [ 5 ]

5 голосов
/ 26 марта 2009

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

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

2 голосов
/ 26 марта 2009

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

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

1 голос
/ 26 марта 2009

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

0 голосов
/ 11 июля 2012

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

0 голосов
/ 26 марта 2009

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

...