Мы создали новое, довольно сложное WPF-приложение с нуля и столкнулись с проблемой производительности по мере увеличения числа команд, зарегистрированных в CommandManager.Мы используем простые легкие команды в нашей реализации MVVM, однако сторонние элементы управления, которые мы используем (Infragistics), не делают, и вызываем CommandManager.RegisterClassCommandBinding, чтобы добавить RoutedCommands.Проблема производительности проявляется в восприятии медлительности пользовательского интерфейса при ответе на пользовательский ввод, например, медленное переключение между элементами управления, ввод текста «прерывистый», а всплывающая анимация «неуклюжий».Когда приложение запускается впервые, пользовательский интерфейс становится быстрым.По мере открытия большего количества экранов, содержащих сетки Infragistics, производительность ухудшается.
Внутри CommandManager есть закрытое поле с именем _requerySuggestedHandlers, которое представляет собой List .Я использовал рефлексию, чтобы получить ссылку на эту коллекцию, и заметил, что когда я вызываю .Clear (), отзывчивость пользовательского интерфейса улучшается до его исходного состояния.Очевидно, что я не хочу обходить очистку коллекций, о которых я мало знаю, особенно с помощью рефлексии (!), Но я сделал это, чтобы увидеть, излечит ли это проблемы с производительностью, и вуаля.
Обычно,эта ситуация прояснится через некоторое время.Однако коллекция WeakReferences (_requerySuggestedHandlers) будет урезана только после запуска сборки мусора, которая является недетерминированной.Из-за этого, когда мы закрываем окна, содержащие сетки (Infragistics XamDataGrid), свойство CanExecute для «мертвых» команд сетки продолжает оцениваться без необходимости, даже после закрытия окна.Это также означает, что если мы закроем несколько окон, производительность все равно будет падать, пока не начнется сборка мусора.Я понимаю, что это может произойти при распределении, и я сам видел это, потому что, если я открою дополнительное окно, это приведет к тому, что начальная память (из расположенной Windows) будет собрана, и производительность вернется к норме.
ИтакУчитывая вышеизложенное, вот мои вопросы:
- Как и откуда вызывается CommandManager.InvalidateRequerySuggested ()?Я не нашел никакой документации на MSDN, которая объясняет это в мельчайших подробностях.Я подключился к событию CommandManager.RequerySuggested и похоже, что оно вызывается всякий раз, когда элементы управления теряют фокус.
- Возможно ли подавить вызов CommandManager.InvalidateRequerySuggested () в ответ на ввод пользователя?
- Кто-нибудь еще сталкивался с этой проблемой, и если так, как вы избежали ее?
Спасибо!