You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Stateless库OnUnhandledTrigger与状态恢复最佳实践

针对C# Stateless库非法触发跳转到指定错误状态的最佳实践

针对你的需求,Stateless库本身提供了规范的实现方式,无需使用临时增删转移、外部存储状态这类hack方案,以下是两种生产环境常用的实现方案:

方案1:直接调用SetState手动修改状态(最简方案)

Stateless的StateMachine类公开了SetState方法,专门用于手动修改状态机的当前状态,你可以直接在OnUnhandledTrigger/OnUnhandledTriggerAsync回调中调用该方法切换到错误状态:

// 定义状态、触发器枚举
enum State { Start, Accepting, Subnegotiation, Echo, ErrorState }
enum Trigger { Accept, Subnegotiate, T1, ExpectedBadTrigger, UnexpectedBadTrigger }

var stateMachine = new StateMachine<State, Trigger>(State.Start);

// 配置正常转移逻辑
stateMachine.Configure(State.Start)
    .Permit(Trigger.Accept, State.Accepting);
stateMachine.Configure(State.Accepting)
    .Permit(Trigger.Subnegotiate, State.Subnegotiation);
stateMachine.Configure(State.Subnegotiation)
    .Permit(Trigger.T1, State.Echo)
    .Permit(Trigger.ExpectedBadTrigger, State.ErrorState);

// 配置未处理触发的回调
stateMachine.OnUnhandledTrigger((state, trigger) =>
{
    // 直接切换到错误状态
    stateMachine.SetState(State.ErrorState);
    // 可扩展添加日志打印、错误上报等逻辑
});

注意:该方案不会触发原状态的Exit回调,也不会触发错误状态的Entry回调,适合不需要执行状态切换附加逻辑的场景。

方案2:提前配置全局错误转移(规范方案,推荐)

如果希望错误跳转走标准的状态机转移流程,触发对应状态的Enter/Exit回调、且转移过程能被状态机的审计、日志模块捕获,可以提前定义一个全局错误触发器,给所有状态配置跳转错误状态的转移,在未处理触发的回调中直接触发该触发器即可:

// 新增全局错误触发器
enum Trigger { Accept, Subnegotiate, T1, ExpectedBadTrigger, UnexpectedBadTrigger, ForceEnterError }

var stateMachine = new StateMachine<State, Trigger>(State.Start);

// 配置正常转移逻辑(同上)

// 给所有业务状态配置跳转到错误状态的通用转移
stateMachine.Configure(State.Start)
    .Permit(Trigger.ForceEnterError, State.ErrorState);
stateMachine.Configure(State.Accepting)
    .Permit(Trigger.ForceEnterError, State.ErrorState);
stateMachine.Configure(State.Subnegotiation)
    .Permit(Trigger.ForceEnterError, State.ErrorState);
stateMachine.Configure(State.Echo)
    .Permit(Trigger.ForceEnterError, State.ErrorState);
// 错误状态本身配置忽略该触发器,避免重复触发
stateMachine.Configure(State.ErrorState)
    .Ignore(Trigger.ForceEnterError)
    .OnEntry(() => {
        // 可扩展执行资源清理、告警推送等错误处理逻辑
    });

// 配置未处理触发的回调
stateMachine.OnUnhandledTrigger((state, trigger) =>
{
    stateMachine.Fire(Trigger.ForceEnterError);
});

这种方案完全符合状态机的设计规范,所有状态切换的附加逻辑都会正常执行,是生产环境的首选方案。


内容的提问来源于stack exchange,提问作者Mercutio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:00:01