c#EventHandler依赖于状态转换

时间:2013-07-03 02:38:59

标签: c# event-handling

我正在建立一个通过池化机制一直监控状态的系统。 一旦一个州转移到另一个州,做一些事情来进一步处理。

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

(例如,Initial - > On,On - > Off,On - > Maintaining,Maintaing - > On,...)

有没有一种改善这个问题的好方法?或任何建议?谢谢!

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");
    }
}

2 个答案:

答案 0 :(得分:1)

真正需要的是状态机。例如,你可以从开到关吗?

这是一个answer来启动状态机。

使用1个委托实现的方式的问题是每个状态将开始使方法更大的工作。在将来的某个时刻,该方法将无法维护,您现在可以使用不同的设计来避免这种情况。

答案 1 :(得分:0)

也许enum可能是States的{​​{1}},而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
    }
}