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

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

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

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

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

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

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

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

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

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

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

alt text

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

11
задан David Hay 8 November 2010 в 22:39
поделиться