4

私のWPFアプリケーションは約30分後に高いCPU使用率を使用しました。次に、アプリケーションを中断して、どのコードが高いCPU使用率を使用したかを調べましたが、何も得られませんでした。

Visual Studio 2008は現在実行中のコードを表示できませんが、[コールスタック]パネルでこれを見つけました。

[睡眠中、待つ、または参加する]
mscorlib.dll!System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle [] waitHandles、int mmolsTimeout、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 executeContext、System.Threading.ContextCallbackコールバック、オブジェクト状態)+0x6fバイト    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()+0x44バイト   

これは何ですか?CPU使用率が高い場合はどうなりますか?そしてCPU使用率を減らす方法は?

4

4 に答える 4

4

"Performance Profiling Tool for WPF"/Visual Profile を使用して、どのイベントが最も CPU 使用率が高いかを調べました。Tick(TimeManager.Tick()) は、アプリの CPU 使用率の約 40% を占めていました。次に、すべてのアニメーション コントロールを 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

于 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 に答える