Обработчики команд CanExecute конфликтуют с моими задачами

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

Я, очевидно, тщательно следил за тем, чтобы не было одновременного доступа к соответствующим данным из моего потока пользовательского интерфейса и этих потоков задач.

НО - иногда (не всегда) моя программа падает, и оказывается, что обработчик команды CanExecute пытается получить доступ к тем же данным, которые обрабатываются в параллельной задаче. Или, наоборот, моя параллельная задача не выполняется, потому что данные уже используются обработчиком CanExecute.

Есть ли рекомендуемый способ решить эту проблему? Могу ли я отключить проверку CanExecute? Должен ли я добавить тест для каждого метода CanExecute?

(В дополнение к этому, глядя на эту проблему, я чрезвычайно удивлен тем, как часто вызывается обработчик CanExecute! Часть меня думает, что по соображениям производительности, было бы целесообразно вручную включать и отключать команды, но, безусловно, своего рода легкая задача, которую WPF пытается сделать для нас проще!)

1 ответ

Решение

Да, меня это тоже смутило, сколько раз вызывается CanExecute. Единственная опция, о которой я могу подумать, потому что у вас мало контроля над проверкой CanExecute, - это минимизация кода в обработчике и использование локального поля CanExecute.

Что-то вроде этого:

CanExecuteSaveData ()
  {
  return _canTheDataBeSaved;
  }

И встроить некоторую проверку параллелизма в этот код, чтобы избежать проблем параллелизма.

Другие вопросы по тегам