我的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使用率?
答案 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时间?