¿Por qué GetMessageW tomaría el uso masivo de la CPU en mi aplicación WPF?

Tengo un rascador de cabeza serio en mis manos aquí. Estoy investigando problemas de rendimiento con un componente WPF en nuestra aplicación.

Nuestra aplicación .net es muy grande, y casi completamente en forma de ventanas. Como parte de una nueva iniciativa, reescribimos uno de nuestros componentes principales con una rica interfaz de usuario de WPF. Hay una gran cantidad de interoperabilidad WinForms <--> WPF con esto para unirlo, y sospecho que puede estar relacionado de alguna manera con lo que estoy viendo.

Cuando perfilo la operación lenta en ANTS profiler, veo mucha actividad ocurriendo dentro de la función UnsafeNativeMethods.IntGetMessageW. ANTS informa tanta actividad de CPU que va allí como lo hace a toda nuestra lógica de negocios y cosas de representación de wpf combinadas. No hay una línea descendente de código administrado de esa función que está usando los ciclos, por lo que lo que sea que haga IntGetMessageW allí es lo que busco.

No estoy particularmente versado en la programación de win32, pero sé lo básico de un bucle de mensajes en ese contexto. Sin embargo, nada de lo que estoy viendo aquí es algo que hacemos manualmente: en ningún punto de nuestro código estamos interactuando directamente con el bucle de mensajes subyacente o con cualquiera de las cosas más complicadas a las que se puede acceder en el despachador de WPF.

Nuestro componente WPF en cuestión aquí está escrito heredado de Window (es decir, no es solo un control / control de usuario), y lo mostramos usando ShowDialog desde nuestra lógica de nivel superior que solía llamar a ShowDialog en la versión anterior de WinForms de este componente. Hay algunos controles de WindowsFormsIntegrationHost que hemos utilizado dentro del componente WPF para preservar la compatibilidad con algunas de nuestras piezas existentes que no se pudieron reescribir en WPF.

He estado investigando esto durante días, pero nunca he encontrado mucho para continuar. Sigo encontrando publicaciones vagamente relacionadas que hablan sobre mensajes de entrada (mouse y teclado), pero no sé qué puedo hacer para verificar eso; Ya he intentado descifrar el código para eliminar todas las operaciones de mouse / teclado que pude.

Estoy teniendo dificultades para llegar a cualquier parte principalmente porque esta línea de código está completamente aislada (no es un padre o hijo de nada que pueda señalar como realmente proviene de nuestro código) y completamente opaca sobre lo que está haciendo.

Aquí hay una imagen de un gráfico de llamadas ANTS de la función ShowDialog que muestra la ruta de las llamadas para llegar aquí:

Me doy cuenta de que esto podría ser algo que solo debe hacerse como parte de WPF (aunque otros componentes que hemos escrito en WPF no muestran este comportamiento), o que esto es solo un error muy extraño en ANTS profiler, pero en este punto necesito verificarlo de una forma u otra. Si alguien puede decirme qué está pasando o qué podría estar sucediendo aquí, o señalarme de alguna manera que podría resolverlo yo mismo, dirigiré todo tipo de buen karma a tu manera.

ACTUALIZACIÓN: En respuesta a alguna discusión a continuación, aquí hay otra vista de ANTS: esta ilustra mejor la confusión que estoy teniendo (esto es con la vista de ANTS en el modo "Tiempo de CPU"). He censurado apresuradamente partes de nuestro código, pero ninguna de las funciones relacionadas con el sistema:

¡Gracias por mirar!

Respuestas a la pregunta(4)

Su respuesta a la pregunta