C# 状态机问题

C# 状态机问题,c#,events,thread-safety,c#-2.0,state-machine,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.EventT

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

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方法是异步的。解决方案是使用同步方法。在收到已处理第一个事件的确认之前,不要发送第二个事件

或者,重写接收代码,使其能够处理无序事件

如果您为
发送
提供代码,并详细描述如何调用您的方法,这将有助于调试问题。

如果顺序重要

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 });
}
对于更复杂的情况,您可以使用开关块,甚至使用


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

对于锁定,我不会使用静态对象,或者您真的需要锁定对象的所有实例吗?否则我会考虑移动一个真正的单体而不是静止的锁。我只是想按照正确的顺序控制我的事件。我真的不需要
。我想我实际上不需要使用
lock
。但我没有找到其他解决办法。谢谢。我想你完全理解我的问题。谢谢你的意见。我同意我的问题与线程和锁定无关。我只是想找到一个解决办法。然后我尝试了
lock
。是的。我得到了几个状态机和复杂的转换。我正在用你的方法做一些测试。非常感谢。