Обработчики команд CanExecute, конфликтующие с моими многопоточными задачами - PullRequest
1 голос
/ 18 мая 2011

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

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

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

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

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

1 Ответ

2 голосов
/ 18 мая 2011

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

Примерно так:

CanExecuteSaveData ()
  {
  return _canTheDataBeSaved;
  }

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

...