2010-10-22 107 views
2

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

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

对于锁定我不会用一个静态对象 - 或者你真的需要在你的对象的所有实例的锁?否则我会考虑转而使用真正的单身人士,而且仍然没有静态锁定。 – weismat 2010-10-22 09:06:42

+0

@weismat。我只是想控制我的事件按照正确的顺序。我并不需要'Lock'。我想我实际上不需要使用'lock'。但我找不到其他解决方案。谢谢。 – 2010-10-22 09:09:51

回答

1

它看起来像你的问题无关,与线程和锁定。

我怀疑你的发送方法是异步的。解决方案是使用同步方法。不要发送第二个事件,直到您确认已处理第一个事件。

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

如果您提供Send代码并添加说明如何你的方法被调用,这将有助于调试问题。

+0

我想你完全理解我的问题。感谢您的输入。我同意我的问题与线程和锁定无关。我只是试图找到一个解决方案。然后我试着'锁定'。 – 2010-10-22 09:12:15

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

对于更复杂的情况下,你可以使用开关块,甚至使用State Pattern

需要锁不仅要同步可以调用这些事件的线程。

+0

是的。我有几个状态机和复杂的转换。我正在用你的方法做一些测试。谢谢。 – 2010-10-22 09:50:52