Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.19 KB | None | 0 0
  1.  public class StateMachine : IStateMachine
  2.     {
  3.         private readonly IFactoryCreator _commandFactoryCreator;
  4.  
  5.         private IWorkMachine _workMachine;
  6.         private EventWaitHandle _awaiterPause;
  7.         private EventWaitHandle _awaiterCancelCommand;
  8.         private CancellationTokenSource _ctsStateReader;
  9.         private CancellationTokenSource _ctsExecuteCommand;
  10.         private ExecuteAbstractCommand _command;
  11.         private HandlerAbstractCommand _handler;
  12.         public StateMachineState State { get; private set; }
  13.         private Subject<StateMachineState> _onChangeState;
  14.  
  15.  
  16.         public StateMachine(IFactoryCreator commandFactoryCreator, IWorkMachine workMachine)
  17.         {
  18.             State = StateMachineState.Idle;
  19.             _commandFactoryCreator = commandFactoryCreator;
  20.             _workMachine = workMachine;
  21.             _onChangeState = new Subject<StateMachineState>();
  22.             _awaiterPause = new AutoResetEvent(true);
  23.             _awaiterCancelCommand = new AutoResetEvent(true);
  24.         }
  25.         public async Task StartAsync()
  26.         {
  27.  
  28.             _ctsStateReader = new CancellationTokenSource();
  29.             var token = _ctsStateReader.Token;
  30.             _awaiterPause.Set();
  31.  
  32.             await Task.Run(async () =>
  33.           {
  34.               while (!token.IsCancellationRequested)
  35.               {
  36.                   var newState = await _workMachine.ReadState();
  37.                   if (CheckStateChange(newState))
  38.                   {
  39.                       _ctsExecuteCommand?.Cancel();
  40.                       UpdateCurrentCommands();
  41.                       HandleCurrentStateAsync();
  42.                   }
  43.                   _ctsStateReader.Token.WaitHandle.WaitOne(100);
  44.               }
  45.  
  46.           }, token);
  47.  
  48.         }
  49.  
  50.         private void HandleCurrentStateAsync()
  51.         {
  52.             _ctsExecuteCommand = new CancellationTokenSource();
  53.             var token = _ctsExecuteCommand.Token;
  54.             Task.Run(() =>
  55.            {
  56.                _awaiterCancelCommand.WaitOne();
  57.                _awaiterCancelCommand.Reset();
  58.                while (!token.IsCancellationRequested)
  59.                {
  60.                    _awaiterPause.WaitOne();
  61.                    _command.Execute();
  62.                }
  63.                _awaiterCancelCommand.Set();
  64.            });
  65.         }
  66.  
  67.  
  68.         private bool CheckStateChange(StateMachineState newState)
  69.         {
  70.             if (newState != State)
  71.             {
  72.                 State = newState;
  73.                 _onChangeState.OnNext(State);
  74.                 return true;
  75.             }
  76.             return false;
  77.         }
  78.  
  79.         private void UpdateCurrentCommands()
  80.         {
  81.             var factory = _commandFactoryCreator.Create(State);
  82.             _command = factory.CreateCommad();
  83.             _handler = factory.CreateHandler();
  84.         }
  85.  
  86.         public void Pause()
  87.         {
  88.             _awaiterPause.Reset();
  89.         }
  90.  
  91.         public void Stop()
  92.         {
  93.             _ctsStateReader.Cancel();
  94.             _ctsExecuteCommand?.Cancel();
  95.         }
  96.  
  97.         public IObservable<StateMachineState> OnChangeState()
  98.         {
  99.             return _onChangeState.AsObservable();
  100.         }
  101.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement