如何降低WPF应用程序的CPU使用率?

时间:2009-05-05 13:21:44

标签: wpf performance cpu

我的WPF应用程序在大约30分钟后使用了高CPU使用率,然后我打破了应用程序以找出哪些代码花费了高CPU使用率,但我什么都没有。

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   
这是什么?高CPU使用率有什么关系? 以及如何降低CPU使用率?

4 个答案:

答案 0 :(得分:4)

我们使用“WPF性能分析工具”/ Visual Profile来确定哪些事件占用了大部分CPU。 Tick(TimeManager.Tick())占用了大约40%的CPU使用率。然后我们逐个删除所有动画控件,最后,我们发现有一个故事板会在大约30分钟后增加CPU使用率。

然后我们改变了形式:


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 :(得分:1)

你应该看看其他线程,我认为显示线程的切换是在visual studio的调试菜单中。 “[在睡眠中,等待或加入”意味着线程无法执行任何操作,因为它正在等待另一个线程完成它的操作。

它可能会陷入某个无限循环中,无论是有意还是无意(例如某些UI不断重绘的东西,如动画或其他东西)无论是什么,它都不在你堆栈中显示的当前线程中。

答案 2 :(得分:1)

您有一些选项可以追踪您的问题。我将从Visual Studio 2008中的性能向导开始。您可以在Analyze菜单中找到它。

答案 3 :(得分:0)

我不是WPF专家,但您在此处显示的调用堆栈可能不是您的问题。该线程正在等待其他一些同步对象,并没有做任何工作。 VS无法显示正在运行的代码的原因是因为它在本机代码中等待(一旦你调用WaitAny(),我相信你会调用一个执行实际等待的本机操作系统构造。)

您的WPF进程中是否还有其他线程正在耗尽CPU时间?