国家机器问题

时间:2010-10-22 08:55:31

标签: c# events thread-safety c#-2.0 state-machine

在同一个函数中有一个状态机有两个转换。

static readonly object _object = new object();

lock (_object)
{
    // I want Host received the event of SMTrans01 first .
    Obj.StateMachine.Send((int)MyStateMachine.EventType.SMTrans01, new object[2] { Obj, MyStateMachine.EventType.SMTrans01 });
}

lock (_object)
{
    // And then I want Host received the event of SMTrans02.
    Obj.StateMachine.Send((int)MyStateMachine.EventType.SMTrans02, new object[2] { Obj, MyStateMachine.EventType.SMTrans02 });
}

我实现了上面的状态机代码。我不确定我是否正确理解Lock陈述?

我需要遵循正确顺序的事件(主机首先接收SMTrans01,然后主机收到SMTrans02事件)。

经过测试,我发现有时候主机会首先收到SMTrans02事件。看起来Lock语句不起作用。我不知道为什么。

有什么好方法可以接近吗?

2 个答案:

答案 0 :(得分:1)

看起来您的问题与线程和锁定无关。

我怀疑你的Send方法是异步的。解决方案是使用同步方法。在得到第一个事件已被处理的确认之前,请勿发送第二个事件。

或者,重写您的接收代码,以便可以处理不按顺序发生的事件。

如果您提供Send的代码,并详细说明如何调用您的方法,以帮助调试问题。

答案 1 :(得分:1)

如果订单重要

EventType _state = EventType.SMTrans02;
if(_state == EventType.SMTrans02 )
{
 _state =EventType.SMTrans01;
  Obj.StateMachine.Send((int)_state, new object[2] { Obj, _state });

}
else
{
_state = EventType.SMTrans02;
Obj.StateMachine.Send((int)_state, new object[2] { Obj, _state });
}

对于更复杂的情况,您可以使用switch block甚至使用State Pattern

您只需锁定即可同步可能会调用这些事件的线程。