在同一个函数中有一个带有两个转换的状态机。
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
语句不起作用。我不知道为什么。
有什么好的方法可以解决吗?
最佳答案
看来您的问题与线程和锁定无关。
我怀疑您的 Send 方法是异步的。解决方案是改用同步方法。在收到第一个事件已处理的确认之前,不要发送第二个事件。
或者,重写您的接收代码,使其能够处理乱序事件。
如果您提供Send
的代码并详细描述您的方法是如何被调用的,这将有助于调试问题。
关于c# - 状态机问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995274/