在同一个函数中有一个状态机有两个转换。
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
语句不起作用。我不知道为什么。
有什么好方法可以接近吗?
答案 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
您只需锁定即可同步可能会调用这些事件的线程。