Обработчики команд CanExecute конфликтуют с моими задачами
Я начал вводить параллельное программирование в свое приложение WPF, чтобы ускорить выполнение более интенсивных и повторяющихся задач. Это идет хорошо, в том, что я вижу заметные различия во времени выполнения и воспринимается реакция пользовательского интерфейса.
Я, очевидно, тщательно следил за тем, чтобы не было одновременного доступа к соответствующим данным из моего потока пользовательского интерфейса и этих потоков задач.
НО - иногда (не всегда) моя программа падает, и оказывается, что обработчик команды CanExecute пытается получить доступ к тем же данным, которые обрабатываются в параллельной задаче. Или, наоборот, моя параллельная задача не выполняется, потому что данные уже используются обработчиком CanExecute.
Есть ли рекомендуемый способ решить эту проблему? Могу ли я отключить проверку CanExecute? Должен ли я добавить тест для каждого метода CanExecute?
(В дополнение к этому, глядя на эту проблему, я чрезвычайно удивлен тем, как часто вызывается обработчик CanExecute! Часть меня думает, что по соображениям производительности, было бы целесообразно вручную включать и отключать команды, но, безусловно, своего рода легкая задача, которую WPF пытается сделать для нас проще!)
1 ответ
Да, меня это тоже смутило, сколько раз вызывается CanExecute. Единственная опция, о которой я могу подумать, потому что у вас мало контроля над проверкой CanExecute, - это минимизация кода в обработчике и использование локального поля CanExecute.
Что-то вроде этого:
CanExecuteSaveData ()
{
return _canTheDataBeSaved;
}
И встроить некоторую проверку параллелизма в этот код, чтобы избежать проблем параллелизма.