У меня здесь серьезный скребок головы.Я исследую проблемы производительности с компонентом WPF в нашем приложении.
Наше приложение .net очень большое и почти полностью в форме Windows.В рамках новой инициативы мы переписали один из наших основных компонентов с богатым пользовательским интерфейсом WPF.Существует множество взаимодействий WinForms <-> WPF с этой штукой, чтобы связать их вместе, и я подозреваю, что это может быть как-то связано с тем, что я вижу.
Когда я профилирую медленную операцию вПрофилировщик ANTS, я вижу много действий, происходящих внутри функции UnsafeNativeMethods.IntGetMessageW.ANTS сообщает о той же активности процессора, что и все наши бизнес-логики и рендеринг wpf вместе взятых.В этой функции, использующей циклы, нет управляемого кода, поэтому все, что делает IntGetMessageW, - это то, что мне нужно.
Я не особо разбираюсь в программировании на win32, но я знаю, чтоосновы цикла сообщений в этом контексте.Однако здесь нет ничего, что мы делаем вручную - ни в одной точке нашего кода мы не взаимодействуем напрямую ни с самим базовым циклом сообщений, ни с какими-либо более сложными вещами, доступ к которым можно получить в диспетчере WPF.
Наш рассматриваемый здесь WPF-компонент написан наследующим от Window (т. Е. Это не просто control / usercontrol), и мы показываем его с помощью ShowDialog из нашей логики более высокого уровня, которая раньше вызывала ShowDialog на старых WinFormsверсия этого компонента.Существуют некоторые элементы управления WindowsFormsIntegrationHost, которые мы использовали внутри компонента WPF для сохранения совместимости с некоторыми из наших существующих частей, которые нельзя переписать в WPF.
Я исследовал это в течение нескольких дней, но никогда не находил много интересного.Я постоянно нахожу смутно связанные посты, в которых говорится о вводимых сообщениях (мышь и клавиатура), но я не знаю, что можно сделать, чтобы это проверить;Я уже пытался разделить код, чтобы удалить все операции с мышью / клавиатурой, которые мог.
Мне трудно добраться куда угодно, в первую очередь потому, что эта строка кода полностью изолирована (не является родителем или потомком чего-либо, что я могу указать на самом деле, исходя из нашего кода), и совершенно непрозрачна в отношении того, что этоделает.
Вот изображение графика вызовов ANTS функции ShowDialog, показывающее путь вызовов, чтобы добраться сюда:
Я полностью понимаю, что это может быть что-то, что простодолжно быть сделано как часть WPF (хотя другие компоненты, которые мы написали в WPF, не отображают это поведение), или что это просто очень странная ошибка в профилировщике ANTS, но на данный момент мне нужно проверить это одним из способов илидругой.Если кто-то может сказать мне, что происходит или может происходить здесь - или указать мне на то, как я смог бы сам это выяснить, я направлю вам все виды хорошей кармы.
ОБНОВЛЕНИЕ:В ответ на некоторые обсуждения ниже, есть еще одно представление от ANTS - это лучше иллюстрирует путаницу, которую я испытываю (это с представлением ANTS в режиме «CPU time»).Я поспешно подверг цензуре части нашего кода, но ни одна из функций, связанных с системой:
Спасибо за внимание!