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

4
我的WPF应用程序在大约30分钟后使用了高CPU使用率,然后我中断了应用程序以找出哪些代码耗费了高CPU使用率,但是我什么都没得到。
Visual Studio 2008无法显示当前运行的代码,但我在“调用堆栈”面板中发现了这个:
[在休眠、等待或加入中] 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使用率?

我使用 WPF 性能分析工具来找出哪些事件或元素占用了高 CPU 资源,结果发现:Tick(TimeManager.Tick()) 占据了应用程序约 40% 的 CPU 使用率。哪些事件会调用 TimeManager.Tick?如何减少它的使用? - Cooper.Wu
4个回答

5
我们使用“WPF性能分析工具”/Visual Profile来查找CPU占用率最高的事件。定时器(TimeManager.Tick())占据了应用程序约40%的CPU使用率。然后我们逐个删除所有动画控件,最终发现一个故事板会在约30分钟后增加CPU使用率。
然后,我们进行了以下更改:

calendarStoryboard.Begin(txtMessage, HandoffBehavior.Compose, true);

为了


calendarStoryboard.Begin(txtMessage, HandoffBehavior.SnapshotAndReplace, true);

这个问题已经解决。更多有关 "HandoffBehavior" 的信息,请参阅 msdn: http://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.handoffbehavior.aspx

1

你应该看看其他线程,我认为显示线程切换的开关在 Visual Studio 的调试菜单中。"[处于睡眠、等待或加入状态]" 表示该线程无法执行任何操作,因为它正在等待另一个线程完成其操作。

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


调试 -> 窗口 -> 线程,但我认为如果您使用的是Express版本的VS,则不可用。 - Davy8
在我打断该应用程序后,我看到了“Threads”面板,其中包含一个主线程和其他一些没有名称的线程。所有创建于代码中的线程都已命名。 - Cooper.Wu

1
你有一些追踪问题的选项。我会从Visual Studio 2008中的性能向导开始。你可以在分析菜单中找到它。

这个功能只能在Team Foundation System中使用吗? - kevindaub

0

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

你的WPF进程中是否有其他正在运行的线程可能正在使用CPU时间?


我没有发现其他正在运行的线程,每当我中断应用程序时,我都会收到这个消息“[在睡眠、等待或连接中...]”。 - Cooper.Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接