ここで頭を悩ませています。アプリケーションの WPF コンポーネントのパフォーマンスの問題を調査しています。
私たちの .net アプリケーションは非常に大きく、ほぼ完全に Windows フォームです。新しいイニシアチブの一環として、コア コンポーネントの 1 つをリッチな WPF UI で書き直しました。多くの WinForms<-->WPF 相互運用がこのことと一緒に行われています。
ANTS プロファイラーで遅い操作をプロファイリングすると、関数 UnsafeNativeMethods.IntGetMessageW 内で多くのアクティビティが発生していることがわかります。ANTS は、すべてのビジネス ロジックと wpf レンダリングを組み合わせたものと同じくらい多くの CPU アクティビティをレポートします。サイクルを使用しているその関数のマネージ コード ダウンラインはありません。
私は win32 プログラミングに特に精通しているわけではありませんが、そのコンテキストでのメッセージ ループの基本は知っています。ここで見ているのは、手動で行うものではありません。コードのどの時点でも、基になるメッセージループ自体や、WPF ディスパッチャーでアクセスできるより複雑なものと直接対話していません。
ここで問題となっている WPF コンポーネントは Window から継承して記述されており (つまり、単なるコントロール/ユーザー コントロールではありません)、このコンポーネントの古い WinForms バージョンで ShowDialog を呼び出していた上位レベルのロジックから ShowDialog を使用して表示します。WPF コンポーネント内で使用した WindowsFormsIntegrationHost コントロールがいくつかあり、WPF で書き換えることができなかった一部の既存の部分との互換性を維持します。
私はこれを何日も調査してきましたが、続けるべきことがたくさん見つかりませんでした。入力メッセージ (マウスとキーボード) について話している漠然と関連する投稿を見つけ続けていますが、それを確認するために何ができるかわかりません。私はすでにコードを解体して、可能なすべてのマウス/キーボード操作を削除しようとしました。
主に、このコード行が完全に分離されており (実際に私たちのコードから来ていると指摘できるものの親または子ではない)、それが何をしているかについて完全に不透明であるため、どこにでも行くのに苦労しています。
ここに到達するための呼び出しのパスを示す ShowDialog 関数の ANTS 呼び出しグラフの画像を次に示します。
これは WPF の一部として実行しなければならないこと (WPF で記述した他のコンポーネントはこの動作を表示しませんが) である可能性があること、またはこれは ANTS プロファイラーの非常に奇妙なバグであることを完全に認識していますが、この時点で、何らかの方法で確認する必要があります。誰かがここで何が起こっているか、または何が起こっているのかを教えてくれたり、自分でそれを理解できる方法を教えてくれたりしたら、あらゆる種類の良いカルマをあなたに向けます.
更新:以下のいくつかの議論に応えて、ANTSからの別のビューがあります-これは、私が抱えている混乱をよりよく示しています(これは、「CPU時間」モードのANTSビューです)。私は急いでコードの一部を検閲しましたが、システム関連の機能は一切検閲しませんでした:
ご覧いただきありがとうございます。