Как уменьшить загрузку процессора приложения WPF? - PullRequest
4 голосов
/ 05 мая 2009

Мое приложение 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   

что это? что случилось с высокой загрузкой процессора? а как уменьшить загрузку процессора?

Ответы [ 4 ]

4 голосов
/ 15 мая 2009

Мы использовали «Инструмент профилирования производительности для WPF» / Визуальный профиль, чтобы выяснить, какие события занимают больше всего ресурсов процессора. Тик (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

1 голос
/ 05 мая 2009

Вы должны взглянуть на другие потоки, я думаю, что переключение для показа потоков находится в меню отладки Visual Studio. «[В спящем режиме, подождать или присоединиться» означает, что поток не может ничего сделать, потому что он ожидает в другом потоке, чтобы завершить свою работу.

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

1 голос
/ 05 мая 2009

У вас есть несколько вариантов для отслеживания вашей проблемы. Я бы начал с мастера производительности в Visual Studio 2008. Вы найдете его в меню «Анализ».

0 голосов
/ 05 мая 2009

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

Есть ли в вашем процессе WPF другие потоки, которые могут использовать процессорное время?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...