c#EventHandler依赖于状态转换

本文关键字:转换 状态 依赖于 c#EventHandler | 更新日期: 2023-09-27 18:20:44

我正在做一个系统,它通过池机制一直监控状态。一旦一个状态转换到另一个状态,就做一些事情来进一步处理。

我想出了一个好主意是EventHandler,它取决于状态转换。但我发现,识别国家过渡可能有很多条件。

(例如,初始->开启、开启->关闭、开启->维护、维护->开启…)

有什么好方法可以改善这个问题吗?或者有什么建议吗?谢谢

class StateMonitor
{
    public delegate void Mydelegate();
    public event Mydelegate SomethingHappened;
    public string _state;
    public StateMonitor()
    {
        SomethingHappened += new Mydelegate(monitor);
        _state = "Initial";
    }
    public string state
    {
        get
        {
            return this._state;
        }
        set
        {
            string temp = value;
            if (SomethingHappened != null)
            {
                if(this.state =="Initial" &&  temp =="On") //state transition
                SomethingHappened();
            }
        }
    }
    public void monitor()
    {
        Console.WriteLine("Happened");
    }
}

c#EventHandler依赖于状态转换

真正想要的是一个状态机。例如,你能从开始到结束吗?

以下是一个答案,让您开始使用状态机。

使用1个委托实现的方法的问题是,每个状态都会开始使执行工作的方法变得更大。在未来的某个时候,这种方法将无法维持,现在可以通过不同的设计来避免这种情况。

也许为States提供enum,并更改Delegate的签名以处理转换,如:

class StateMonitor
{
    public enum States { initial, on, off, maintaining };
    public delegate void Mydelegate(States stFrom, States stTo);
    public event Mydelegate SomethingHappened;
    public States _state;
    public StateMonitor()
    {
        SomethingHappened += new Mydelegate(monitor);
        _state = States.initial;
    }
    public States state
    {
        get
        {
            return this._state;
        }
        set
        {
            if (SomethingHappened != null)
            {
                SomethingHappened(this._state, value);
            }
            _state = value;
        }
    }
    public void monitor(States stateFrom, States stateTo)
    {
        if (stateFrom == States.initial && stateTo == States.on)
        {
            // Do something for from Intitial state to On State
        }
        else if (stateFrom == States.on && stateTo == States.off)
        {
            // Do something for from On state to Off State
        }
        //... the rest of the code here
    }
}