代码之家  ›  专栏  ›  技术社区  ›  Cooper.Wu

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

  •  4
  • Cooper.Wu  · 技术社区  · 17 年前

    大约30分钟后,我的WPF应用程序使用了高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 回复  |  直到 14 年前
        1
  •  4
  •   Cooper.Wu    17 年前

    我们使用“针对WPF的性能分析工具”/可视化分析来发现哪些事件占用了大部分CPU使用。Tick(TimeManager.Tick())占用了应用程序大约40%的CPU使用率。然后我们一个接一个地移除所有动画控件,最后,我们发现有一个故事板会在大约30分钟后增加CPU的使用。

    然后我们改变了形式:

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

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

    此问题已解决。有关移交行为的详细信息,请参阅msdn:

    http://msdn.microsoft.com/en-us/library/system.windows.media.animation.handoffbehavior.aspx

        2
  •  1
  •   Davy8    17 年前

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

    它可能被卡在一个无限循环中的某个地方,不管是有意的还是无意的(有意的,比如某个UI对象连续重新绘制,比如动画或其他东西),不管它是什么,它都不在堆栈中显示的当前线程中。

        3
  •  1
  •   Tor Haugen    17 年前

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

        4
  •  0
  •   Jeremy Wiebe Tomas Reimers    17 年前

    我不是WPF专家,但您在这里显示的调用堆栈可能不是您的问题。该线程正在等待其他同步对象,没有执行任何操作。vs无法显示正在运行的代码的原因是因为它在本机代码中等待(一旦调用waitany(),我相信您会调用本机OS构造来执行实际的等待)。

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