Я с самого начала понял, что конечный автомат без сохранения состояния не является потокобезопасным. Но мне это не нужно, пока у меня есть способ исправить это внешне. У меня сложилось впечатление, что если просто поставить внешнюю блокировку на каждый вызов функции StateMachine.Fire, эту проблему можно решить.
Код: Выделить всё
lock(_lock)
MyMachine.Fire(Trigger.DoSomething);
Наше приложение использует его таким образом и работает очень хорошо, но иногда (редко) мне сообщают об ошибках, которые выглядят (в моих журналах) как изменение состояния, которое не должно быть возможным, учитывая триггеры, которые я запустил. И, похоже, это происходит в основном на более медленных машинах, поэтому это похоже на состояние гонки.
Но я не могу воспроизвести это сам, поэтому не могу определить, связана ли проблема с чем-то другим. ошибка многопоточности в моей логике или из-за того, что этот подход в корне неадекватен.
Я посмотрел логику организации очередей в исходном коде и кажется, что внешняя блокировка должна работать .
Нужен ли здесь новый подход?
Подробнее здесь:
https://stackoverflow.com/questions/787 ... al-locking