我手上有一个严重的挠头。我正在调查我们应用程序中 WPF 组件的性能问题。
我们的 .net 应用程序非常大,而且几乎完全采用 Windows 形式。作为一项新计划的一部分,我们使用丰富的 WPF ui 重写了我们的核心组件之一。有很多 WinForms<-->WPF 互操作与这个东西粘合在一起,我怀疑这可能与我所看到的有关。
当我在 ANTS 分析器中分析缓慢的操作时,我看到函数 UnsafeNativeMethods.IntGetMessageW 内部发生了很多活动。ANTS 报告的 CPU 活动与我们所有的业务逻辑和 wpf 渲染内容的组合一样多。该函数没有使用循环的托管代码下线,因此无论 IntGetMessageW 正在做什么,这就是我所追求的。
我不是特别精通 win32 编程,但我知道在这种情况下消息循环的基础知识。不过,我在这里看到的都不是我们手动执行的任何操作——在我们的代码中,我们没有直接与底层消息循环本身进行交互,也没有与任何可以在 WPF 调度程序上访问的更复杂的东西进行交互。
我们这里讨论的 WPF 组件是继承自 Window 编写的(即,它不仅仅是一个控件/用户控件),我们使用 ShowDialog 来展示它,该逻辑是在我们用于在该组件的旧 WinForms 版本上调用 ShowDialog 的更高级别逻辑之外的。我们在 WPF 组件内部使用了一些 WindowsFormsIntegrationHost 控件,以保持与我们现有的一些无法在 WPF 中重写的部分的兼容性。
我已经研究了好几天了,但从来没有发现很多事情要做。我一直在寻找有关输入消息(鼠标和键盘)的模糊相关帖子,但我不知道我能做些什么来验证这一点;我已经尝试过删除代码以删除我可以进行的所有鼠标/键盘操作。
我很难到达任何地方,主要是因为这行代码是完全隔离的(不是我可以指出实际上来自我们的代码的任何东西的父或子),并且对于它正在做什么完全不透明。
这是 ShowDialog 函数的 ANTS 调用图的图像,显示了到达此处的调用路径:
我完全意识到这可能只是作为 WPF 的一部分必须完成的事情(尽管我们在 WPF 中编写的其他组件不会显示这种行为),或者这只是 ANTS 探查器中的一个非常奇怪的错误,但在这一点我需要以一种或另一种方式验证它。如果有人能告诉我这里正在发生或可能发生的事情——或者给我指出一些我自己能够弄清楚的方法,我会按照你的方式引导各种善业。
更新:针对下面的一些讨论,这是 ANTS 的另一种观点——这个观点更好地说明了我的困惑(这是“CPU 时间”模式下的 ANTS 视图)。我匆忙审查了我们的部分代码,但没有一个与系统相关的功能:
感谢您的关注!