2010-08-18 2 views
3

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

Мой вопрос, то есть is Есть ли что-нибудь, что я могу сделать, чтобы улучшить отзывчивость в моем приложении WPF? Мои окна, как правило, довольно сложны по стилю и композиции, и я уже использую виртуализацию StackPanels.

Чтобы проиллюстрировать мою проблему: у меня есть текстовое поле, которое действует как окно поиска, и я хочу, чтобы результаты отображались «на лету» как пользовательские типы (каждый результат инкапсулируется в UserControl и отображается в ItemsControl). Я использую фоновые потоки для выполнения поиска. Проблема в том, что когда WPF отображает результаты поиска, который полностью блокирует пользовательский интерфейс, чтобы печатать на несколько секунд за раз, в то время как WPF отбирается, делая все «результаты по мере ввода» не очень жизнеспособными.

Можно ли каким-либо образом избежать обхода нити пользовательского интерфейса при рендеринге WPF?

+3

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

+0

Хм, вы можете быть на что-то. Когда я отключу изменение списка результатов, все еще существует некоторое очевидное отставание, которое не должно происходить. Я рассмотрю это - спасибо за идею. – devios1

+0

Спасибо Nir - ваша идея закончилась тем, что выявила серьезное замедление, которое происходило в потоке пользовательского интерфейса, которое я раньше не заметил. Перемещение этого в поток поиска значительно улучшило отзывчивость. Так что все не так плохо, как казалось на первый взгляд. :) – devios1

ответ

1

Учитывая, что вы уже используете потоки для извлечения данных, я могу только предположить, что возвращаемые наборы данных достаточно велики, чтобы вызвать замедление. (Могли бы вы предоставить некоторые показатели там?) Например, у вас может быть поток, получающий массив имен, но если результат будет во многих тысячах, то при связывании, безусловно, произойдет удар производительности.

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

+0

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

+0

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

+0

Я использую 4.0, и сначала заметил некоторые улучшения, но недостаточно, чтобы справиться с этой проблемой. Теперь я не уверен, что вызывает проблемы, хотя я использую * lot * привязки. – devios1

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