Вот как я решил эту проблему. Но сначала небольшая справочная информация:
Пользователь нажимает кнопку в графическом интерфейсе, которая запускает упаковщик конфет. Это делается через привязку команды во ViewModel, которая затем вызывает низкоуровневую функцию в модели. Функция в модели запускает поток и выполняет конечный автомат.
В какой-то момент машина выйдет из строя. Когда это произойдет, я собираю информацию об ошибке и возможных (известных) методах восстановления. Я помещаю это в объект, а затем передаю его в графический интерфейс через интерфейс обратного вызова. Тем временем рабочий поток застрял в ожидании установки события.
В конце концов, работник конфет заметит ошибку и нажмет кнопку, сообщающую системе, что делать. Это приводит к двум вещам: 1) он помечает один из методов восстановления как предпочтительный и 2) устанавливает событие. Теперь рабочий поток продолжается, проверяет предпочтительный метод восстановления после ошибок и переходит в соответствующее состояние на конечном компьютере.
Это работает очень хорошо (пока). Часть, которую я знаю, полностью хромает - это способ проверки предпочтительного метода восстановления после ошибок. По сути, я устанавливаю строковую переменную, а затем сравниваю эту строку со списком известных строк. Ультра хромая, но я не уверен в лучшем способе сделать это, кроме использования enum. У кого-нибудь есть рекомендации для меня?