2009-05-05 15 views
4

私のWPFアプリケーションは約30分後に高い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())でしたアプリのCPU使用率は約40%です。どのイベントでTimeManager.Tickが呼び出されますか?どのようにそれを減らすには? –

答えて

4

"パフォーマンスプロファイリングツールfor WPF"/Visual Profileを使用して、どのイベントが最もCPU使用率が高いかを調べました。 Tick(TimeManager.Tick())は、アプリケーションの約40%のCPU使用率を要しました。すべてのアニメーションコントロールを1つずつ削除しました。最後に、約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

私はアプリケーションを壊すたびに、他の実行中のスレッドを見つけられませんでした。このメッセージを受け取りました "[睡眠中、待っていたり、参加しています...] –

1

あなたは他のスレッドを見てください、私はスレッドを表示するトグルは、Visual Studioのデバッグメニューにあると思う。 「[スリープ中、待機中、または結合中]は、スレッドが操作を完了するために別のスレッドで待機しているため、何もできないことを意味します。

意図的かどうかにかかわらず(意図的に、アニメーションや何かのような何かのUIのものを再描画しているような)無限ループのどこかに詰まっているかもしれません。何でも、スタックに表示されている現在のスレッドにはありません。

+0

"別のスレッド "はどうやって見つかりますか? –

+0

デバッグ - > Windows - >スレッドだが、私はVSのExpress版では使用していないと思う。 – Davy8

+0

私はアプリケーション、メインスレッド、およびその他のスレッドを壊した後に "スレッド"パネルを見た、名前は付けられていませんでした。コードiで作成されたすべてのスレッドが名前を付けました。 –

1

問題を追跡するためのオプションがあります。私はVisual Studio 2008のパフォーマンスウィザードを使い始めるでしょう。あなたはAnalyzeメニューでそれを見つけるでしょう。

+0

この機能はTeam Foundation Systemでのみ利用できますか? – kevindaub

関連する問題