2009-05-05 352 views
4

約30分鐘後,我的WPF應用程序使用高CPU使用率,然後我打破了應用程序,找出哪些代碼花費高CPU使用率,但我什麼都沒有。如何減少WPF應用程序的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

我使用性能剖析了WPF工具來發現哪些事件或元素採取的CPU使用率很高,後來我們發現:蜱(TimeManager.Tick())是大約40%的CPU使用率的應用程序。哪些事件會調用TimeManager.Tick?如何減少它? – 2009-05-12 06:44:05

回答

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

0

我不是WPF專家,但您在此處展示的調用堆棧可能不是您的問題。該線程正在等待其他同步對象,並且沒有做任何工作。 VS無法顯示運行代碼的原因是因爲它在本地代碼中等待(一旦你調用WaitAny()我相信你會調用一個本地OS構造來實現等待)。

是否有任何其他線程在您的WPF過程中運行,可能會佔用CPU時間?

+0

我沒有找到任何其他正在運行的線程,每當我打破應用程序,我得到這個消息「[在睡覺,等待,或加入...」 – 2009-05-05 15:18:54

1

你應該看看其他線程,我認爲顯示線程的切換位於visual studio的調試菜單中。 「[在睡眠中,等待或加入」意味着線程無法執行任何操作,因爲它正在等待另一個線程完成操作。

它可能會被卡在無限循環的某個地方,無論是有意或無意(例如某些UI事物不斷重繪,如動畫或其他東西)無論它是什麼,它都不在當前線程顯示在堆棧中。

+0

我如何找到「另一個線程」? – 2009-05-05 15:15:50

+0

調試 - > Windows - >線程,但我認爲它不適用於VS的Express版本,如果這是你正在使用 – Davy8 2009-05-05 15:34:10

+0

我看到「線程」面板後,我打破了應用程序,一個主線程和其他線程,這些都沒有命名。在代碼中創建的所有線程都已命名。 – 2009-05-06 01:36:01

1

您有一些選項可用於追蹤您的問題。我將從Visual Studio 2008中的Performance Wizard開始。您可以在Analyze菜單上找到它。

+0

該功能僅適用於Team Foundation System嗎? – kevindaub 2009-05-15 03:16:47