Подтвердить что ты не робот

Производительность приложения WPF С#

У нас есть приложение С# WPF, написанное на .Net 4.0, которое имеет относительно простую привязку данных и функциональность сетки.

Стилирование вызывает несколько "хитростей", включая некоторые цвета наведения и т.д.

На 3 машинах из развертывания, охватывающего 20, мы сталкиваемся с некоторыми очень странными проблемами производительности с пользовательским интерфейсом.

Эффективно после перезагрузки приложение работает хорошо, но после определенного (неопределенного) количества времени пользовательский интерфейс становится невероятно вялым. Например, наведите указатель мыши на кнопку, и будет задержка до нескольких секунд, прежде чем будет наложена/отображена цветовая стилизация наведения.

Машины имеют почти идентичные спецификации. Драйверы графики были обновлены, а установка starndard - две карты NVidia Quadro 290. Кроме того, мы сделали тестовое приложение, содержащее ТОЛЬКО некоторые тестовые компоненты пользовательского интерфейса (включая Fluent Ribbon) и отсутствие кода. Проблема все еще возникает.

Я запустил Windows Performance Suite для "глубокого погружения" в WPF среды исполнения, и, что очень странно, пользовательский интерфейс возвращается к нормальной реакции, если отмечен флажок "Disable Dirty Region Support". Я понимаю, что, если что-нибудь, это должно еще больше снизить производительность.

Я не могу ничего другого попробовать здесь. Анализ производительности DotTrace предполагает, что большая часть времени приложения расходуется в PresentationFramework.dll.

[EDIT] Все компьютеры - Windows XP SP3.

[РЕД.] Возможно, это происходит на всех машинах и что обычно не разрешается запускать приложение достаточно долго, чтобы представить проблему. Мы тестируем это сейчас.

[EDIT]. Следует также отметить, что мы экспериментируем с подробным описанием здесь. Он был установлен на одной машине на данный момент, и я буду обновлять соответствующим образом.

[EDIT - через 24 часа]. Таким образом, две машины теперь работают один и тот же код за одну ночь. На моей машине (которая никогда не демонстрировала проблему), после первоначального входа в приложение было очень неаккуратно, но спустя менее минуты вернулась к нормальной работе. (Я положил это на машину, явно снимая с HDD). На другой машине (которая обычно демонстрирует проблему), приложение улучшилось через несколько секунд, но все еще сейчас вяло по сравнению с моим.

[EDIT - через 48 часов] На тестовой машине тестовое приложение теперь полностью не отвечает (заблокировано) после работы в течение 48 часов. На одном и том же компьютере приложение WPF с легким "оболочкой" (содержащее элемент управления вкладкой, некоторые кнопки и несколько панелей и сеток) все еще работает и отлично реагирует. Итак, что-то в этих более сложных элементах управления вызывает эту проблему... которая действительно указывает на (потенциально) триггеры и делегаты, которые могут быть основной причиной. Я посмотрю, как профилировать приложение/элементы управления еще раз. Между тем, есть ли у кого-нибудь какие-либо советы о том, как обеспечить, чтобы приложение "очищалось" после себя через определенные промежутки времени? Потому что мы смотрим на сторонние элементы управления здесь, поэтому мои возможности для их редактирования ограничены!

Поблагодарили бы за любые советы, которые могут быть предоставлены!

4b9b3361

Ответ 1

попробуйте сделать wpf в программном режиме.

в загруженном событии:

HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;

Ответ 2

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

На dev-машине у вас может быть уже запущена визуальная студия или ранее были запущены другие приложения WPF, и все сборки должны были быть загружены к моменту запуска вашего приложения.

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

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