版权声明:原创文章版权归我所有——学习则共享。 https://blog.csdn.net/kesshei/article/details/89371477
用法
class Program
{
static void Main(string[] args)
{
//状态机
//根据当前的不同的状态,做出不同的事件操作
StateMachine.Register("cat", new Cat());
StateMachine.Register("dog", new Dog());
StateMachine.SetState("cat");
int i = 0;
StateMachine.Start();
StateMachine.RunInterval = 10;
Thread.Sleep(2000);
StateMachine.SetState("dog");
Thread.Sleep(2000);
StateMachine.SetState("cat");
Console.ReadLine();
}
}
这个是运行的结果
核心代码如下:
对象接口
/// <summary>
/// 状态对象
/// </summary>
public interface IStateObject
{
/// <summary>
/// 进入状态
/// </summary>
void EnterState();
/// <summary>
/// 离开状态
/// </summary>
void ExitState();
/// <summary>
/// 更新状态
/// </summary>
void UpdateState();
}
状态机 的实现
/// <summary>
/// 状态机
/// </summary>
public class StateMachine
{
/// <summary>
/// 运行 Update 时间间隔 毫秒
/// </summary>
public static int RunInterval = 500;
/// <summary>
/// 当前状态
/// </summary>
private static string CurrentState;
/// <summary>
/// 字典存放当前所有对象
/// </summary>
private static ConcurrentDictionary<string, IStateObject> Dic = new ConcurrentDictionary<string, IStateObject>();
/// <summary>
/// 当前的线程对象
/// </summary>
private static Thread thread;
/// <summary>
/// 是否已经在运行
/// </summary>
private static bool IsRun = false;
/// <summary>
/// 注册一个状态对象
/// </summary>
/// <param name="stateObject"></param>
/// <param name="istateObject"></param>
public static void Register(string stateObject, IStateObject istateObject)
{
Dic.AddOrUpdate(stateObject, istateObject, (a, b) => b);
}
/// <summary>
/// 设置当前状态
/// </summary>
/// <param name="stateObject"></param>
public static void SetState(string stateObject)
{
if (CurrentState != stateObject)
{
if (CurrentState != null)
{
IStateObject obj = null;
Dic.TryGetValue(CurrentState, out obj);
if (obj != null)
{
obj.ExitState();
}
}
CurrentState = stateObject;
IStateObject objobj = null;
Dic.TryGetValue(CurrentState, out objobj);
if (objobj != null)
{
objobj.EnterState();
}
}
}
/// <summary>
/// 自己启动服务
/// </summary>
public static void Start()
{
if (!IsRun)
{
thread = new Thread(new ThreadStart(Run));
thread.IsBackground = true;
thread.Start();
IsRun = true;
}
}
/// <summary>
/// 自己停止服务
/// </summary>
public static void Close()
{
if (IsRun)
{
try
{
thread.Abort();
while (thread.ThreadState != ThreadState.Aborted)
{
SpinWait.SpinUntil(() => false, 20);
}
}
catch (Exception)
{
}
thread = null;
IsRun = false;
}
}
/// <summary>
/// 线程执行的任务
/// </summary>
private static void Run()
{
while (true)
{
Updata();
SpinWait.SpinUntil(() => false, RunInterval);
}
}
/// <summary>
/// 更新数据
/// </summary>
public static void Updata()
{
IStateObject objobj = null;
Dic.TryGetValue(CurrentState, out objobj);
if (objobj != null)
{
objobj.UpdateState();
}
}
}