4

大约 30 分钟后,我的 WPF 应用程序使用了高 CPU 使用率,然后我中断了应用程序以找出哪些代码使用了高 CPU 使用率,但我什么也没得到。

Visual Studio 2008 无法显示当前正在运行的代码,但我在“调用堆栈”面板中找到了这个:

[在睡眠中,等待,或加入]
mscorlib.dll!System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext) + 0x8f 字节
System.dll!System.Net.TimerThread.ThreadProc() + 0x2f9 字节    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态)+ 0x66 字节   
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态) + 0x6f 字节    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 字节   

这是什么?CPU使用率高有什么问题?以及如何降低 CPU 使用率?

4

4 回答 4

4

我们使用“WPF 性能分析工具”/Visual Profile 来找出哪些事件占用 CPU 最多。Tick(TimeManager.Tick()) 占用了应用程序大约 40% 的 CPU 使用率。然后我们将所有的 Animation-Controls 一个一个地删除,最后,我们发现有一个故事板会在大约 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

于 2009-05-15T03:03:58.340 回答
1

你应该看看其他线程,我认为显示线程的切换在 Visual Studio 的调试菜单中。“[在睡眠、等待或加入中”意味着线程不能做任何事情,因为它正在等待另一个线程完成它的操作。

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

于 2009-05-05T13:32:21.327 回答
1

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

于 2009-05-05T13:34:13.320 回答
0

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

您的 WPF 进程中是否有任何其他线程正在运行可能会占用 CPU 时间?

于 2009-05-05T13:27:00.200 回答