DispatcherTimer, съедающий ЦП, со временем вызывающий WPF, визуальный не рендеринг правильно

У меня нет определенных горячих подсказок для этого компилятора, но когда у меня есть этот вид проблемы, я выполняю ProcMon для наблюдения то, что процесс делает на машине, и я выполняю Wireshark, чтобы проверить, что это не тратит возрасты, синхронизирующие некоторый доступ к сети к давно забытой машине, на которую ссылаются в некотором ключе реестра или переменной среды.

5
задан discorax 13 October 2009 в 20:21
поделиться

3 ответа

Вы говорите, что каждый раз создаете экземпляр класса Clock? Обратите внимание, что таймеры в .NET будут иметь root-доступ, чтобы не попасть в сборку мусора. Они будут продолжать стрелять, пока вы сами их не остановите, и они будут поддерживать ваши объекты Clock в живых, потому что на них ссылаются в событии тика таймера.

Я думаю, что происходит то, что с каждым созданным вами Clock вы запускаете другой таймер. Сначала вы запускаете только 1 событие в секунду, но затем вы добавляете еще один таймер и получаете 2 события в секунду, и они продолжают накапливаться таким образом. В конце концов вы видите, что ваш обработчик Tick и AnimatedRenderMessageHandler увеличивают нагрузку на ЦП, пока они не остановятся и не смогут обновить ваш экран. Это также объясняет, почему увеличение частоты срабатывания таймера заставляет ваши симптомы проявляться раньше.

5
ответ дан 14 December 2019 в 08:55
поделиться

Вы предполагаете, что это DispatcherTimer, и полностью сосредоточились на нем. Лично мне трудно поверить, что это как-то связано с самим таймером, скорее я думаю, что это связано с тем, что вы делаете в пределах таймера. Не могли бы вы рассказать нам подробнее, что происходит каждый раз, когда срабатывает таймер?

1
ответ дан 14 December 2019 в 08:55
поделиться
hHandRT.Angle = _hAngle;
mHandRT.Angle = _mAngle;
sHandRT.Angle = _sAngle;

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

Вы устанавливаете свойство Angle вашего преобразования для всех трех преобразований, даже если вам не нужно, чтобы они менялись каждую секунду. Ваша минута будет меняться каждые 60 изменений, а ваш час будет меняться каждые 3600 секунд. Однако вы можете, по крайней мере, уменьшить угол изменения часов на каждую секунду.

Здесь происходит следующее: всякий раз, когда вы запрашиваете изменения преобразования в WPF, WPF ставит запрос в очередь приоритетной отправки, и каждую секунду вы подталкиваете к выполнению дополнительных изменений. он может обрабатывать. И это единственная причина, по которой использование вашего ЦП продолжает увеличиваться вместо памяти.

Подробный анализ:

После просмотра вашего кода я чувствую, что ваше событие DispatcherTimer_Tick выполняет слишком много вычислений,

1
ответ дан 14 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: