как уменьшить загрузку процессора приложением WPF?

StackOverflow https://stackoverflow.com/questions/824832

  •  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 другие потоки, которые могут использовать процессорное время?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top