как уменьшить загрузку процессора приложением WPF?
-
05-07-2019 - |
Вопрос
Мое приложение WPF использовало высокую загрузку ЦП примерно через 30 минут, затем я остановил приложение, чтобы узнать, какой код использовал высокую загрузку ЦП, но ничего не получил.
Visual Studio 2008 не может отображать текущий работающий код, но я нашел это на панели «Стек вызовов»:
[In a sleep, wait, or join] mscorlib.dll!System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext) + 0x8f bytes System.dll!System.Net.TimerThread.ThreadProc() + 0x2f9 bytes mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes
что это?что случилось с высокой загрузкой процессора?и как уменьшить загрузку процессора?
Решение
Мы использовали «Инструмент профилирования производительности для WPF»/Visual Profile, чтобы выяснить, какие события больше всего используют процессор.Tick(TimeManager.Tick()) занимал около 40% загрузки процессора приложения.затем мы удалили все элементы управления анимацией один за другим и, наконец, обнаружили, что раскадровка увеличивает загрузку процессора примерно через 30 минут.
затем мы изменили форму:
calendarStoryboard.Begin(txtMessage, HandoffBehavior.Compose, true);
к
calendarStoryboard.Begin(txtMessage, HandoffBehavior.SnapshotAndReplace, true);
эта проблема была исправлена.дополнительную информацию о HandoffBehavior см. в msdn:
http://msdn.microsoft.com/en-us/library/system.windows.media.animation.handoffbehavior.aspx
Другие советы
Вы должны взглянуть на другие потоки, я думаю, переключение для отображения потоков находится в меню отладки Visual Studio. " [во сне, подождать или присоединиться " означает, что поток не может ничего сделать, потому что он ожидает в другом потоке, чтобы завершить свою операцию.
Возможно, он где-то застрял в бесконечном цикле, намеренно или нет (намеренно, например, когда какой-то пользовательский интерфейс постоянно перерисовывается, например, анимация или что-то в этом роде). Что бы это ни было, его нет в текущем потоке, показанном в вашем стеке. р>
У вас есть несколько вариантов для отслеживания вашей проблемы. Я бы начал с мастера производительности в Visual Studio 2008. Вы найдете его в меню «Анализ».
Я не эксперт WPF, но показанный здесь стек вызовов, вероятно, не является вашей проблемой. Этот поток ожидает другого объекта синхронизации и не выполняет никакой работы. Причина, по которой VS не может отобразить работающий код, заключается в том, что он ожидает в собственном коде (как только вы вызываете WaitAny (), я полагаю, что вы вызываете в нативную конструкцию ОС, которая выполняет фактическое ожидание).
Есть ли в вашем процессе WPF другие потоки, которые могут использовать процессорное время? Р>