Зависание WPF, связанное с ICommand.CanExecuteChanged?C#

Место общения программистов C#
Ответить
Anonymous
 Зависание WPF, связанное с ICommand.CanExecuteChanged?

Сообщение Anonymous »

Моя реализация RelayCommand реализует событие ICommand.CanExecuteChanged:

Код: Выделить всё

public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
Приложение имеет большие размеры и имеет пользовательский интерфейс, состоящий из множества плавающих дочерних окон (MDI). CanExecuteChanged работает, реагируя на любые события мыши или клавиатуры где угодно в пользовательском интерфейсе, поэтому чем сложнее пользовательский интерфейс (и, предположительно, чем больше экземпляров RelayCommand), тем больше риск проблем с производительностью.
В приложении есть пользовательские интерфейсы, которые иногда зависают на пару секунд (зависает весь пользовательский интерфейс приложения, а не только какой-то конкретный пользовательский интерфейс). Один пользовательский интерфейс начал зависать гораздо дольше, иногда на неопределенный срок, и освободить его можно только свернув, а затем восстановив главное окно. Его сложно воспроизвести и отладить.
Я уверен, что это связано с пользовательским интерфейсом, а не с кодом. Часто кажется, что это происходит просто при перемещении мыши или щелчке мыши, что заставило меня задуматься, связано ли это с ICommand.CanExecuteChanged. Возможно, мне не следовало реализовывать CanExecuteChanged так, как я это сделал (который будет встроен в каждую RelayCommand), но рефакторинг сотен RelayCommands и кнопок не является вариантом.

Код: Выделить всё

RelayCommand
конструктор:

Код: Выделить всё

public RelayCommand(Action execute, Predicate canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
Если я изменю CanExecuteChanged так, чтобы он связывал событие только в том случае, если был назначен делегат _canExecute:

Код: Выделить всё

public event EventHandler CanExecuteChanged
{
add
{
if (_canExecute != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (_canExecute != null)
CommandManager.RequerySuggested -= value;
}
}
Поможет ли это? Многие RelayCommands не будут иметь делегата _canExecute, так может ли это снизить рабочую нагрузку за счет отсутствия необходимости обрабатывать событие для таких экземпляров?

Подробнее здесь: https://stackoverflow.com/questions/798 ... utechanged
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»