using OS.Spin.Common.MultiThread; using OS.Spin.Modle.Command; using System.Collections.Generic; using System.Threading; namespace OS.Spin.Commands { public class CommandDesk { private static CommandDesk _cDk; private static readonly object ObjLock = new object(); private SemaphorePool _semaphorePool; private Thread _runThread; private Queue _commandKeys = new Queue(); public static CommandDesk GetInstance() { lock (ObjLock) { return _cDk ?? (_cDk = new CommandDesk()); } } private CommandDesk() { // 申请信号量 _semaphorePool = OS.Spin.Common.MultiThread.SemaphorePool.GetInstance(); _semaphorePool.MakeSemaphore(OS.Spin.Running.Infos.Names.S_COMMAND_RUN); if (null == _runThread) { _runThread = new Thread(Run); _runThread.Start(); } } private void Run() { while (true) { _semaphorePool.Wait(OS.Spin.Running.Infos.Names.S_COMMAND_RUN); if (_commandKeys.Count > 0) { // 获取指令 var key = _commandKeys.Dequeue(); // 执行指令 //DoExcute(key); } } } public void Execute(CommandKey key) { _commandKeys.Enqueue(key); _semaphorePool.Release(OS.Spin.Running.Infos.Names.S_COMMAND_RUN); } } }