У меня есть серьезный головной уборщик на руках. Я изучаю проблемы производительности с компонентом WPF в нашем приложении.
Наше приложение .net очень велико и почти полностью в виде окон. В рамках новой инициативы мы переписали один из наших основных компонентов с богатым WPF ui. Существует много взаимодействий WinForms ↔ WPF с этой штукой, чтобы склеить их вместе, и я подозреваю, что это может быть каким-то образом связано с тем, что я вижу.
Когда я просматриваю медленную операцию в профилировщике ANTS, я вижу много активности внутри функции UnsafeNativeMethods.IntGetMessageW. ANTS сообщает о том, что активность процессора идет именно так, как это происходит со всей нашей бизнес-логикой и wpf-рендерингом. Отсутствует управляемый код в нижней части этой функции, которая использует циклы, поэтому независимо от того, что делает IntGetMessageW, это то, что мне нужно.
Я не очень хорошо разбираюсь в программировании win32, но я знаю основы цикла сообщений в этом контексте. Ничто из того, что я здесь вижу, - это все, что мы делаем вручную - ни в коем случае в нашем коде мы не взаимодействуем напрямую либо с самим базовым мессалогом, либо с любым более сложным материалом, доступ к которому можно получить в диспетчере WPF.
Здесь наш компонент WPF написан наследующим от Window (т.е. не просто элементом управления /usercontrol ), и мы показываем его с помощью ShowDialog из нашей логики более высокого уровня, которая использовалась для вызова ShowDialog в старой версии WinForms этого компонент. Есть некоторые элементы управления WindowsFormsIntegrationHost, которые мы использовали внутри компонента WPF, чтобы сохранить совместимость с некоторыми из наших существующих фрагментов, которые нельзя было переписать в WPF.
Я исследовал это в течение нескольких дней, но так и не смог найти много нового. Я продолжаю находить смутно связанные публикации, которые говорят о входных сообщениях (мышь и клавиатура), но я не знаю, что я могу сделать, чтобы проверить это; Я уже пытался разбить код, чтобы удалить каждую операцию мыши/клавиатуры, которую я мог бы сделать.
Мне нелегко добраться в первую очередь из-за того, что эта строка кода полностью изолирована (а не родитель или ребенок из всего, что я могу указать, как фактически исходящий из нашего кода), и полностью непрозрачна в отношении того, что она делает.
Вот изображение графика вызовов ANTS функции ShowDialog, показывающего путь к вызовам:
Я полностью понимаю, что это может быть что-то, что нужно сделать только как часть WPF (хотя другие компоненты, написанные в WPF, не отображают это поведение), или что это просто очень странная ошибка в профилировании ANTS, но в этот момент мне нужно проверить это так или иначе. Если кто-нибудь может сказать мне, что здесь происходит или может быть здесь, или указать мне каким-то образом, я смогу понять это сам, я направлю все виды хорошей кармы на ваш путь.
UPDATE: В ответ на некоторое обсуждение ниже, вот еще один взгляд от ANTS - это лучше иллюстрирует путаницу, которую я испытываю (это с представлением ANTS в режиме "CPU time" ). Я спешно подвергал цензуре части нашего кода, но ни одна из связанных с системой функций:
Спасибо, что посмотрели!