Почему в моем приложении WPF GetMessageW заняло значительное использование процессора?

У меня здесь серьезный скребок головы. Я исследую проблемы производительности с компонентом WPF в нашем приложении.

Наше приложение .net очень большое и почти полностью в форме Windows. В рамках новой инициативы мы переписали один из наших основных компонентов с богатым пользовательским интерфейсом WPF. Существует множество взаимодействий WinForms <-> WPF с этой штукой, чтобы связать их вместе, и я подозреваю, что это может быть как-то связано с тем, что я вижу.

Когда я профилирую медленную операцию в профилировщике ANTS, я вижу много действий, происходящих внутри функции UnsafeNativeMethods.IntGetMessageW. ANTS сообщает о той же активности процессора, что и все наши бизнес-логики и рендеринг wpf вместе взятых. В этой функции, использующей циклы, отсутствует управляемый код, поэтому все, что делает IntGetMessageW, - это то, что мне нужно.

Я не особо разбираюсь в программировании на win32, но я знаю основы цикла сообщений в этом контексте. Однако здесь нет ничего, что мы делаем вручную - ни в одной точке нашего кода мы не взаимодействуем напрямую ни с самим базовым циклом сообщений, ни с какими-либо более сложными вещами, доступ к которым можно получить в диспетчере WPF.

Наш рассматриваемый здесь WPF-компонент написан наследующим от Window (т. Е. Это не просто элемент управления / usercontrol), и мы показываем его, используя ShowDialog из нашей логики более высокого уровня, которая раньше вызывала ShowDialog в старой версии WinForms этого компонента. Существуют некоторые элементы управления WindowsFormsIntegrationHost, которые мы использовали внутри компонента WPF для сохранения совместимости с некоторыми из наших существующих частей, которые нельзя переписать в WPF.

Я исследовал это в течение нескольких дней, но никогда не находил много интересного. Я постоянно нахожу смутно связанные посты, в которых говорится о вводимых сообщениях (мышь и клавиатура), но я не знаю, что можно сделать, чтобы это проверить; Я уже пытался разделить код, чтобы удалить все операции с мышью / клавиатурой, которые мог.

Мне трудно добраться куда-нибудь, в первую очередь потому, что эта строка кода полностью изолирована (не является родителем или потомком чего-либо, что я на самом деле могу выделить из нашего кода), и совершенно непрозрачна в том, что она делает.

Вот изображение графика вызовов ANTS функции ShowDialog, показывающее путь вызовов, чтобы добраться сюда:

Я полностью понимаю, что это может быть чем-то, что просто необходимо сделать как часть WPF (хотя другие компоненты, которые мы написали в WPF, не отображают это поведение), или что это просто очень странная ошибка в профилировщике ANTS, но в этот момент мне нужно проверить это так или иначе. Если кто-то может сказать мне, что происходит или может происходить здесь - или указать мне на то, как я смог бы сам разобраться, я направлю все виды хорошей кармы на ваш путь.

ОБНОВЛЕНИЕ: В ответ на некоторые обсуждения ниже, вот еще один взгляд от ANTS - этот лучше иллюстрирует мою путаницу (это с представлением ANTS в режиме «CPU time»). Я поспешно подверг цензуре части нашего кода, но ни одна из функций, связанных с системой:

Спасибо за внимание!

Ответы на вопрос(4)

Ваш ответ на вопрос