Если вы ищете высокопроизводительный конечный автомат на основе .Net, я бы порекомендовал Stateless . Вот выдержка из сайта проекта:
Поддерживаются большинство стандартных конструкций конечных автоматов:
- Общая поддержка штатов и
триггеры любого типа .NET (числа,
строки, перечисления и т. д.)
- Иерархические состояния Вход / выход
события для штатов
- Охранные пункты для поддержки условных
переходы
- Самоанализ
Также предоставляются некоторые полезные расширения:
- Возможность хранить состояние внешне
(например, в отслеживаемом свойстве
Linq to SQL)
- Параметризованные триггеры
- Входящие штаты
Конфигурация выглядит следующим образом:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
phoneCall.Configure(State.Ringing)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.CallConnected, State.Connected);
phoneCall.Configure(State.Connected)
.OnEntry(() => StartCallTimer())
.OnExit(() => StopCallTimer())
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
// ...
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
И приятно то, что, поскольку он реализует Generics, вы можете использовать int или string для представления состояний и триггеров, что позволяет очень легко интегрироваться с вашей базой данных или ORM. Прелесть в том, что нет никакого дополнительного хоста времени выполнения, о котором вам нужно беспокоиться, просто загрузите конечный автомат с текущим состоянием из объекта или записи, и все готово.