Временная остановка отображения WPF - PullRequest
8 голосов
/ 18 апреля 2011

У меня есть автономное приложение WPF, работающее в .NET 3.5.Время от времени дисплей просто зависает на несколько секунд.Это особенно заметно на экранах, где что-то часто обновляется. Вот видео , показывающее проблему.

Пока дисплей не работает, интерфейс остается отзывчивым ( video ).

Я сталкивался с другими постами с похожими проблемами, которые связывали это с проблемой рендеринга SW / HW.Чтобы быть безопасным, я полностью отключил рендеринг HW, но проблема все еще остается.

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

Последнее замечание. Целевой платформой является небольшой ПК с сенсорным экраном без большой памяти или лошадиных сил (512 МБ).Я вижу только эту проблему на цели , но не на моем компьютере для разработки, который имеет гораздо больше ресурсов.

ОБНОВЛЕНИЕ

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

Вот еще несколько вещей, которые я попробовал:

  • Обновлен до .NET 4.0.То же поведение.
  • Добавлен код отладки для всех методов, которые могут быть вызваны через DispatcherTimer (которые вызываются в потоке пользовательского интерфейса), чтобы убедиться, что ни один из них не удерживает пользовательский интерфейс.

Я действительно в тупике и добавил награду.Как я уже говорил, проблема возникает только на целевом ПК ( ссылка ).

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Я склонен заподозрить либо .NET GC, либо файл подкачки ОС, когда появляется такое поведение.

В первом случае вы можете попробовать счетчики производительности .NET, чтобы отслеживать подозрительные действия.

Если на устройстве имеется файл подкачки, его можно отключить и посмотреть, изменится ли поведение.

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

1 голос
/ 25 апреля 2011

Причиной был следующий вызов метода:

new HwndSource(new HwndSourceParameters());

Это было добавлено в мое приложение, потому что оно исправило проблему утечки памяти в .NET 3.5.Этот обходной путь можно найти здесь .Если я уберу этот вызов, проблемы с рендерингом исчезнут.

Я снял вызов и исправил утечку памяти другим способом (убрав анимацию раскадровки и использовав вместо нее код)

1 голос
/ 18 апреля 2011

Вы пытались профилировать приложение на протестированной системе? Использование профилировщика памяти и / или производительности?

Вы можете получить некоторые полезные сведения из теста этого типа: некоторые профилировщики .Net И вот один для WPF: WPF-профилировщик от Microsoft

...