c# - 状态机问题

标签 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 语句不起作用。我不知道为什么。

有什么好的方法可以解决吗?

最佳答案

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

我怀疑您的 Send 方法是异步的。解决方案是改用同步方法。在收到第一个事件已处理的确认之前,不要发送第二个事件。

或者,重写您的接收代码,使其能够处理乱序事件。

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

关于c# - 状态机问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995274/

相关文章:

c# - Windows Phone xaml Grid Holding 事件未触发

Java:是否所有静态方法都需要同步?

multithreading - 使用 LD_PRELOAD 和线程安全注入(inject)线程

java - 线程安全与同步

c# - 在 Unity Inspector 中隐藏 EditorGUILayout.ObjectField 的 "Object Picker"?

events - 为什么 Ext.form.Field.setValue() 不触发事件? "fix"怎么办呢?

c# - 为什么输入 "System.Byte[]"却出现 "byte[]"?

javascript - DOMNodeInsertedIntoDocument 应该冒泡吗?

c# - iTunes SDK/API 文档在哪里?

c# - 从 ASP.NET WebAPI 应用程序调用 Web 服务